home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 126-150 / disk_144 / analyticalc / analysources.arc / AnalyNS.Ftn < prev    next >
Text File  |  1988-04-10  |  83KB  |  3,076 lines

  1. c -h- nextel.fms    Tue Sep  2 10:58:55 1986    
  2.     SUBROUTINE NEXTEL (RETVAL,RETTYP,RETCD)
  3. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  4. C ALL RIGHTS RESERVED
  5. C
  6. C  SCANS LINE(80) FROM NONBLK+1 AND RETURNS THE NEXT ELEMENT.
  7. C  THIS ELEMENT COULD BE A CONSTANT, VALUE OF A VARIABLE, A
  8. C  BINARY FUNCTION CODE, OR A UNARY FUNCTION CODE. UPON RETURN,
  9. C  NONBLK POINTS TO LAST CHARACTER OF NEXT ELEMENT.
  10. C
  11. C  RETCD  =    1  IF OPERAND (VALUE IN RETVAL(100)
  12. C        2  IF OPERATOR (VALUE IN RETTYP)
  13. C        3  NO MORE ELEMENTS
  14. C        4  IF ERROR
  15. C
  16. C  RETVAL  HOLDS VALUE OF OPERAND FOUND (EITHER CONSTANT OR IF
  17. C       A VARIABLE (A-Z,%), THE VALUE OF THAT VARIABLE)
  18. C
  19. C  RETTYP  IS THE TYPE CODE
  20. C NEXTEL CALLS
  21. C
  22. C ERRMSG     PRINTS OUT ERROR MESSAGES
  23. C FLIP       REVERSES THE NON-LEADING ZERO DIGITS IN A VECTOR
  24. C GETNNB     GETS THE NEXT NON-BLANK FROM LINE(80)
  25. C
  26. C NEXTEL IS CALLED BY INPOST
  27. C
  28. C
  29. C    VARIABLE    USE
  30. C    ---------   ----------------------------------
  31. C
  32. C    ALPHA(27)   HOLDS LEGAL VARIABLE NAMES.
  33. C
  34. C    ARROW       '^'
  35. C
  36. C    B10         SWITCH SET WHEN CONSTANT IS NOT OCTAL (MAY BE
  37. C                DECIMAL OR HEX BECAUSE THE DIGIT 8 OR 9 WAS FOUND).
  38. C
  39. C    B16         SWITCH SET WHEN CONSTANT IS HEXADECIMAL BECAUSE
  40. C                DIGIT A, B, C, D, E, OR F WAS FOUND.
  41. C
  42. C    BASE        HOLDS BASE OF CONSTANT.
  43. C
  44. C    CHAR1       HOLDS A SINGLE CHARACTER FROM LINE.
  45. C
  46. C    DEFBAS      THE DEFAULT BASE SPECIFIED.
  47. C
  48. C    DIGITS(16,3) HOLDS ASCII CHARACTERS FOR THE DIGITS OF BASES
  49. C                 8, 10, AND 16.
  50. C
  51. C    DOT          '.'
  52. C
  53. C    EQ           '='
  54. C
  55. C    EXCODE       CODE FOR EXPONENTIATION.
  56. C
  57. C    FCNT         NUMBER OF UNARY FUNCTIONS DEFINED BY VECTOR FUNCT
  58. C
  59. C    FUNCT (NAME,INDXX) HOLDS FUNCTION NAMES.
  60. C
  61. C    FUNVAL(I,J)
  62. C     IF I=1, THE VALUE IS THE NUMBER OF CHARACTERS IN THE J-TH
  63. C             FUNCTION WHOSE NAME IS THE FUNCT(K,J) WHERE K=1,2,3...10
  64. C     IF I=2, THE VALUE IS THE STACK ELEMENT CODE FOR THE J-TH
  65. C             FUNCTION WHOSE NAME IS IN FUNCT(K,J), K=1,2,3...10
  66. C
  67. C
  68. C    I,J,K,L  HOLDS TEMPORARY VALUES
  69. C
  70. C    I1,I2    HOLD VALUE OF DIGITS IN E OR D SPECIFICATION.
  71. C
  72. C    IALPHA   INDEX INTO ALPHA OF THE FIRST NON-BLANK CHARACTER FOUND.
  73. C
  74. C    IHOLD    HOLDS TEMPORARY VALUES
  75. C
  76. C    INT      PICKS UP INTEGER*4 VALUES.
  77. C
  78. C    IPT      POINTER TO ELEMENTS IN LINE(80).
  79. C
  80. C    IPT2     POINTER TO ELEMENTS IN LINE(80).
  81. C
  82. C    LASTOP  USED TO HOLD VALUE OF LAST OPERATOR SO THAT UNARY OPERATORS
  83. C            CAN BE IDENTIFIED IN CASES LIKE A*-B AND A/(-3).
  84. C
  85. C    MINUS   '-'
  86. C
  87. C    OPER(9) HOLDS LEGAL ONE CHARACTER OPERATORS LIKE '+' AND '*'.
  88. C
  89. C    PLUS    '+'
  90. C
  91. C    QUOTE   "'"
  92. C
  93. C    RB      HOLDS NEGATIVE POWERS OF 10.(BASE 10)
  94. C
  95. C    REAL    PICKS UP REAL*8 CONSTANTS.
  96. C
  97. C    RETCD   RETURN CODE:
  98. C              1 IF OPERAND (VALUE IN RETVAL(100))
  99. C              2 IF OPERATOR (VALUE IN RETTYP)
  100. C              3 NO MORE ELEMENTS.
  101. C              4 IF ERROR.
  102. C
  103. C    RETCD2  RETURN CODE WHEN CALLING GETNNB.
  104. C
  105. C    RETPT   INDEXES DIGITS PICKED UP FOR A CONSTANT.
  106. C
  107. C    RETTYP  THE TYPE CODE OF THE RETURNED ELEMENT.
  108. C
  109. C    TYPE    TYPE CODE FOR EACH VARIABLE.
  110. C
  111. C    VBLS    HOLDS VALUE OF VARIABLES.
  112. C
  113. C    VLEN    GIVES LENGTH IN BYTES FOR EACH DATA TYPE.
  114. C
  115. C LASTOP MUST BE SET TO ZERO AT START OF EXPRESSION
  116. C
  117. C
  118.     REAL*8 REAL,RB,ACX,XAC
  119.     INTEGER*4 INT
  120.     EXTERNAL INDX,DFLOAT
  121.     REAL*8 DFLOAT
  122.     InTeGer*4 INDXX
  123.     InTeGer*4 LEVEL,NONBLK,LEND
  124.     InTeGer*4 LASTOP
  125.     InTeGer*4 VIEWSW,BASED,VLEN(9),DEFBAS
  126.     InTeGer*4 TYPE(1,1)
  127.     InTeGer*4 RETCD,RETCD2,RETTYP,EXCODE
  128.     InTeGer*4 B10,B16,RETPT,BASE
  129.     InTeGer*4 FCNT,AHOLD
  130.     InTeGer*4 I,J,K,L,IALPHA,IHOLD,IPT,IPT2,I1,I2
  131. C
  132.     CHARACTER*1 CHAR1,DOT,ARROW,QUOTE,STAR,MINUS,PLUS
  133.     CHARACTER*1 RETVAL(20)
  134. C    REAL*8 RVLF
  135. C    EQUIVALENCE (FVLF,RETVAL(1))
  136.     CHARACTER*1 FUNCT(10,40)
  137.     InTeGer*4   FUNVAL(2,40)
  138.     CHARACTER*1 AVBLS(20,27)
  139.     EQUIVALENCE(XAC,AVBLS(1,27))
  140.     CHARACTER*1 VBLS(8,1,1)
  141.     CHARACTER*1 OPER(9),DIGITS(16,3)
  142.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  143.     CHARACTER*1 FOUR(4),EIGHT(8)
  144. C
  145.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  146.     COMMON /DIGV/ DIGITS
  147.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  148.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  149. C ***<<< KLSTO COMMON START >>>***
  150.     InTeGer*4 DLFG
  151. C    COMMON/DLFG/DLFG
  152.     InTeGer*4 KDRW,KDCL
  153. C    COMMON/DOT/KDRW,KDCL
  154.     InTeGer*4 DTRENA
  155. C    COMMON/DTRCMN/DTRENA
  156.     REAL*8 EP,PV,FV
  157.     DIMENSION EP(20)
  158.     INTEGER*4 KIRR
  159. C    COMMON/ERNPER/EP,PV,FV,KIRR
  160. c    InTeGer*4 LASTOP
  161. C    COMMON/ERROR/LASTOP
  162.     CHARACTER*1 FMTDAT(9,76)
  163. C    COMMON/FMTBFR/FMTDAT
  164.     CHARACTER*1 EDNAM(16)
  165. C    COMMON/EDNAM/EDNAM
  166.     InTeGer*4 MFID(2),MFMOD(2)
  167. C    COMMON/FRM/MFID,MFMOD
  168.     InTeGer*4 JMVFG,JMVOLD
  169. C    COMMON/FUBAR/JMVFG,JMVOLD
  170.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  171.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  172. C ***<<< KLSTO COMMON END >>>***
  173. CCC    COMMON /ERROR/ LASTOP
  174. C
  175.     EQUIVALENCE (REAL,EIGHT),(FOUR,INT)
  176. C
  177.     DATA DOT/'.'/,ARROW/'^'/,QUOTE/''''/,STAR/'*'/
  178.     DATA MINUS/'-'/,PLUS/'+'/
  179.     DATA OPER/'(','-','!','*','/','+','-',')','='/
  180. C
  181. C  NUMBER OF FUNCTIONS
  182.     DATA FCNT/30/
  183. C
  184.     DATA FUNCT/'A','B','S',' ',' ',' ',' ',' ',' ', ' ',
  185.      1             'D','A','B','S',' ',' ',' ',' ',' ',' ',
  186.      2             'I','A','B','S',' ',' ',' ',' ',' ',' ',
  187.      3             'F','L','O','A','T',5*' ','I','F','I','X',6*' ',
  188.      5             'A','I','N','T',6*' ','I','N','T',7*' ',
  189.      7             'I','D','I','N','T',5*' ','E','X','P',7*' ',
  190.      9             'D','E','X','P',6*' ','A','L','O','G','1','0',4*' ',
  191.      2             'D','L','O','G','1','0',4*' ','A','L','O','G',6*' ',
  192.      4             'D','L','O','G',6*' ','S','Q','R','T',6*' ',
  193.      6             'D','S','Q','R','T',5*' ','S','I','N',7*' ',
  194.      8             'D','S','I','N',6*' ','C','O','S',7*' ',
  195.      1             'D','C','O','S',6*' ','T','A','N','H',6*' ',
  196.      2             'D','T','A','N','H',5*' ','A','T','A','N',6*' ',
  197.      3             'D','A','T','A','N',5*' ',
  198.      1             'A','S','I','N',6*' ','D','A','S','I','N',5*' ',
  199.      2             'A','C','O','S',6*' ','D','A','C','O','S',5*' ',
  200.      3             'T','A','N',' ',6*' ','D','T','A','N',106*' '/
  201.     DATA EXCODE/112/
  202.        DATA FUNVAL/3,31,4,31,4,32,5,33,4,34,4,35,3,36,5,36,3,37,4,37,
  203.      1 6,39,6,39,4,38,4,38,4,40,5,40,3,41,4,41,3,42,4,42,4,43,5,43,
  204.      2       4,44,5,44,4,45,5,45,4,46,5,46,3,47,4,47,20*0/
  205. C
  206. 10    CONTINUE
  207.     CALL GETNNB(IPT,RETCD2)
  208.     IF (RETCD2.EQ.1) GOTO 50
  209. C
  210. C  NO MORE ELEMENTS
  211.     LASTOP=0
  212.     RETCD=3
  213.     RETURN
  214. C
  215. C
  216. C  INITIALIZE VARIABLES
  217. 50    CONTINUE
  218.     B10=0
  219.     B16=0
  220.     RETTYP=0
  221.     RETPT=0
  222.     REAL=0.D0
  223.     RETCD=1
  224.     DEFBAS=BASED
  225. C    RVLF=0.0D0
  226. C COMMENT OUT DO LOOP OVER 20 BYTES FOR SPEED.
  227. C (INSTEAD JUST ZERO 8 BYTES WE WILL LIKELY USE)
  228.     DO 60 I=1,8
  229. C    DO 60 I=1,20
  230. 60    RETVAL(I)=0
  231. C
  232. 70    CHAR1=LINE(IPT)
  233.     NONBLK=IPT
  234. C
  235. C
  236. C  SEE IF ALPHABETIC OR %
  237. C SHORTCUT IF IT'S A CELL NAME .. GO JUST EVALUATE IT.
  238. C ALSO WORKS FOR ENCODED FUNCT NAMES.
  239.     IF(ICHAR(CHAR1).GE.255)GOTO 12000
  240. C SEPARATE OUT FUNCTION CALLS FOR FASTER EXECUTION...SKIP TRYING FUNCT. NAME
  241. C FIRST AS VARIABLE NAME (WHICH CAN TAKE LONG TIME TO CONVERT BEFORE WE DISCOVER
  242. C IT ISN'T NEEDED...)
  243. C
  244.     IF(ICHAR(CHAR1).GE.230)GOTO 13201
  245. C ADD COUPLE MORE SHORTCUTS... DON'T JUST LOOP TO SEE IF WE HAVE
  246. C AN ALPHA CHARACTER...
  247.     IF(CHAR1.NE.ALPHA(27))GOTO 78
  248.     I=27
  249.     GOTO 10000
  250. 78    CONTINUE
  251.     IF(CHAR1.LT.'A'.OR.CHAR1.GT.'Z')GOTO 79
  252. C TRY TO AVOID LOTS OF EXTRA FUNCTION CALLS...
  253. C COMPARE CHARS AS CHARACTER VALUES... SHOULD STILL BE OK.
  254. CCC    IF(ICHAR(CHAR1).LT.ICHAR(ALPHA(1))
  255. CCC     1  .OR.ICHAR(CHAR1).GT.ICHAR(ALPHA(26)))GOTO 79
  256. C USE FACT THAT ASCII CHARACTER CODES ARE IN A CONTINUOUS RANGE
  257. CCC    I=ICHAR(CHAR1)-ICHAR(ALPHA(1))
  258.     I=ICHAR(CHAR1)-65
  259. C 65 IS ASCII VALUE FOR 'A' CHARACTER.
  260. C (HARDCODE FOR SPEED...)
  261.     GOTO 10000
  262. 79    CONTINUE
  263. C DELETE 3 LINES FOLLOWING:
  264. C    DO 80 I=1,27
  265. C    IF (CHAR1.EQ.ALPHA(I)) GOTO 10000
  266. C80    CONTINUE
  267. C
  268. C
  269. C  NOT ALPHA SO SEE IF AN OPERATOR
  270.     DO 100 I=1,9
  271.     IF (CHAR1.EQ.OPER(I)) GOTO 20000
  272. 100    CONTINUE
  273. C
  274. C
  275. C SEE IF AN OPERAND
  276. C *** EVIDENTLY SHORT LOOP RUNS AS FAST AS A COUPLE DECISIONS AND SOME
  277. C MATH; LEAVE IN.
  278. 140    DO 150 I=1,16
  279.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  280. 150    CONTINUE
  281. C
  282. C
  283. C
  284.     IF (CHAR1.EQ.DOT) GOTO 40000
  285. C
  286. C
  287. C
  288.     IF (CHAR1.EQ.ARROW) GOTO 300
  289. C
  290. C
  291. C
  292.     IF (CHAR1.EQ.QUOTE) GOTO 200
  293. C
  294. C
  295. C  ADDITIONAL CONSTANT OPERATOR WOULD GO HERE
  296. C
  297. C
  298. C *** ERROR *** ILLEGAL CHARACTER ENCOUNTERED
  299. 190    CALL ERRMSG (20)
  300.     GOTO 99000
  301. C
  302. C
  303. C
  304. C
  305. C **************************************
  306. C ****** ASCII CONSTANT SPECIFIED ******
  307. C **************************************
  308. 200    CONTINUE
  309.     NONBLK=NONBLK+1
  310.     RETVAL(1)=ICHAR(LINE(NONBLK))
  311.     RETTYP=1
  312.     GOTO 35100
  313. C
  314. C
  315. C
  316. C
  317. C **************************************
  318. C ****** IMMEDIATE BASE SPECIFIED ******
  319. C **************************************
  320. 300    CALL GETNNB(IPT,RETCD2)
  321.     IF (RETCD2.EQ.1) GOTO 320
  322. C
  323. C
  324. C *** ERROR *** ILLEGAL BASE SPECIFICATION
  325. 310    CALL ERRMSG(19)
  326.     GOTO 99000
  327. C
  328. C
  329. C  IMMEDIATE BASE SPECIFICATION
  330. 320    CHAR1=LINE(IPT)
  331.     NONBLK=IPT
  332.     IF (CHAR1.EQ.DIGITS(8,3)) GOTO 360
  333.     IF (CHAR1.NE.DIGITS(1,3)) GOTO 310
  334. C
  335. C
  336. C FIRST DIGIT IS 1 SO IMMEDIATE BASE MIGHT BE 10 OR 16
  337.     CALL GETNNB (IPT,RETCD2)
  338.     IF (RETCD2.EQ.2) GOTO 310
  339.     CHAR1=LINE(IPT)
  340.     NONBLK=IPT
  341.     IF (CHAR1.EQ.DIGITS(10,1)) GOTO 365
  342.     IF (CHAR1.NE.DIGITS(6,1)) GOTO 310
  343. C
  344. C
  345. C IMMEDIATE BASE IS 16
  346.     DEFBAS=16
  347.     GOTO 370
  348. C
  349. C
  350. C IMMEDIATE BASE IS 8
  351. 360    DEFBAS=8
  352.     GOTO 370
  353. C
  354. C
  355. C IMMEDIATE BASE IS 10
  356. 365    DEFBAS=10
  357. C
  358. C
  359. C
  360. 370    CALL GETNNB(IPT,RETCD2)
  361.     IF (RETCD2.EQ.2) GOTO 310
  362.     CHAR1=LINE(IPT)
  363.     NONBLK=IPT
  364. C
  365. C
  366. C GO FIND OUT WHAT NUMBER HAS THAT DEFAULT BASE
  367.     GOTO 140
  368. C
  369. C
  370. C
  371. C
  372. C ****************************************************
  373. C ****** SEARCH TO SEE IF A UNARY FUNCTION NAME ******
  374. C ****************************************************
  375. 10000    CONTINUE
  376.     IALPHA=I
  377.     IHOLD=NONBLK
  378. C
  379. C
  380. C SCAN EACH OF THE FUNCTION NAMES.
  381.     DO 10060 I=1,FCNT
  382. C
  383. C K HOLDS NUMBER OF NON-BLANK CHARACTERS IN THE FUNCTION NAME.
  384.     K=FUNVAL(1,I)
  385.     IPT2=IHOLD
  386.     NONBLK=IHOLD
  387.     IF (K.EQ.0) GOTO 10060
  388. C
  389. C
  390. C SCAN EACH LETTER OF THE FUNCTION'S NAME
  391.     DO 10050 J=1,K
  392.     IF (LINE(IPT2).NE.FUNCT(J,I)) GOTO 10060
  393.     IF (J.EQ.K) GOTO 10100
  394.     CALL GETNNB (IPT2,RETCD2)
  395.     IF (RETCD2.EQ.2) GOTO 10060
  396.     NONBLK=IPT2
  397. 10050    CONTINUE
  398.     STOP 10050
  399. C
  400. 10060    CONTINUE
  401. 10070    NONBLK=IHOLD
  402.     GOTO 12000
  403. C
  404. C
  405. C  FUNCTION FOUND (LEAVES NONBLK POINTING AT LAST CHARACTER)
  406. 10100    CONTINUE
  407. C
  408. C
  409. C
  410. C
  411. C **********************************
  412. C ****** UNARY FUNCTION FOUND ******
  413. C **********************************
  414.     RETTYP=ICHAR(CHAR(FUNVAL(2,I)))
  415.     LASTOP=RETTYP
  416.     RETCD=2
  417.     GOTO 99099
  418. C
  419. C
  420. C
  421. C
  422. C
  423. C ********************************
  424. C ****** VARIABLE SPECIFIED ******
  425. C ********************************
  426. 12000    CONTINUE
  427. C
  428. C
  429. C  IALPHA HOLDS INDEX INTO ALPHA OF NAME
  430. C ******&&&&&& REMOVE BLK OF CODE STARTING HERE...
  431. C    CALL GETNNB (IPT,RETCD2)
  432. C    IF (RETCD2.EQ.2) GOTO 12060
  433. CC
  434. CC
  435. CC MAKE SURE NEXT CHARACTER IS NOT ALPHA
  436. C    DO 12050 I=1,27
  437. C    IF (LINE(IPT).EQ.ALPHA(I)) GOTO 12200
  438. C12050    CONTINUE
  439. C *****&&&&& ...ENDING HERE
  440. C ADD BELOW...
  441.     LLB=IPT
  442.     LRB=LEND
  443.     CALL VARSCN(LINE,LLB,LRB,LSTCHR,ID1,ID2,IVALID)
  444. C    IF(IVALID.EQ.0)GOTO 12200
  445. C    IPT=LSTCHR
  446.     IF(IVALID.NE.0.AND.ID2.LE.1.AND.ID1.GT.60)GOTO 13201
  447.     IF(IVALID.NE.0)GOTO 12201
  448. C NOT VALID VARIABLE. SEE IF A 2 + ARGUMENT FUNCTION...
  449. C
  450. C COME HERE DIRECT FOR FUNCTIONS ENCODED...
  451. 13201    CONTINUE
  452.     I=IPT+9
  453.     CALL FNAME(LINE(IPT),I,INDEXF)
  454.     IF(INDEXF.EQ.6.OR.INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 12202
  455. C NOW KNOW THERE IS A FUNCTION THERE, SO HANDLE IT.
  456.     LLAST=LEND-IPT+1
  457.     I=INDX(LINE(IPT),ICHAR(']'))
  458.     IF(I.LE.0.OR.I.GT.LLAST)GOTO 12202
  459.     LRB=I
  460.     LLB=INDX(LINE(IPT),ICHAR('['))
  461.     IF(LLB.LE.0.OR.LLB.GT.LLAST)GOTO 12202
  462.     CALL DOMFCN(LINE(IPT),LLB,LRB,INDEXF,ACX)
  463.     XAC=ACX
  464.     TYPE(1,1)=2
  465.     CALL TYPSET(1,27,TYPE(1,1))
  466. C    TYPE(27,1)=2
  467.     ID1=27
  468.     ID2=1
  469.     LSTCHR=LRB+IPT
  470. C GO AND MERGE AS THOUGH WE JUST GOT A VARIABLE % AND HAD TO
  471. C RETURN ITS VALUE.
  472.     GOTO 12201
  473. C IF NOT VALID FUNCTION REPORT AN ERROR.
  474. 12202    GOTO 12200
  475. 12201    IPT=LSTCHR
  476.     IF(LSTCHR.LT.LEND)IPT=IPT-1
  477.     NONBLK=IPT
  478. C RESET NONBLK ALST SO WE RESET GETNNB TOO...
  479. C WAS IPT=LSTCHR+1
  480. C IPT POINTS AFTER VARIABLE NAME...
  481. C ENSURE NON ALPHA AFTER VARIABLE NAME
  482.     CALL GETNNB(IPT,RETCD2)
  483.     IF(RETCD2.EQ.2) GOTO 12060
  484. C
  485. C IF THE NEXT CHARACTER IS AN = SIGN DON'T RETURN VALUE
  486. C OF VARIABLE, JUST PUT INDEX INTO VBLS INTO LOWER BYTE
  487. C OF RETVAL.
  488.     IF (LINE(IPT).EQ.EQ) GOTO 12100
  489. C
  490. C
  491. C ************************************************
  492. C ****** RETURN VALUE OF VARIABLE SPECIFIED ******
  493. C ************************************************
  494. 12060    CALL TYPGET(ID1,ID2,RETTYP)
  495. C12060    RETTYP=TYPE(ID1,ID2)
  496. C *****&&&&&
  497. C MUST CLAMP TYPES SO EXTENDED VARIABLES CAN'T BE MULT PRCN VRBLS.
  498.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12061
  499.     IF (RETTYP.EQ.5)RETTYP=4
  500.     IF (RETTYP.EQ.6)RETTYP=8
  501.     IF (RETTYP.EQ.7)RETTYP=3
  502. 12061    CONTINUE
  503.     IF(RETTYP.LE.0)GO TO 12080
  504.     K=VLEN(RETTYP)
  505.     DO 12070 I=1,K
  506.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12068
  507. C TRY AND CALL XVBLGT HERE TO GET VALUE ALL AT ONCE
  508. C TO AVOID MULTIPLE ARBITRATION...
  509.     IF(I.EQ.K)CALL XVBLGT(ID1,ID2,RETVAL)
  510. C    CALL VBLGET(I,ID1,ID2,RETVAL(I))
  511. C    RETVAL(I)=VBLS(I,ID1,ID2)
  512.     GOTO 12070
  513. 12068    RETVAL(I)=AVBLS(I,ID1)
  514. 12070    CONTINUE
  515. C
  516. 12080    LASTOP=RETTYP
  517.     GOTO 99099
  518. C
  519. C
  520. C
  521. C *******************************************************
  522. C ****** VARIABLE SPECIFIED BUT FOLLOWED BY = SIGN ******
  523. C *******************************************************
  524. 12100    CONTINUE
  525. C    RETVAL(1)=IALPHA
  526. C    RETTYP=TYPE(IALPHA)
  527.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  528.     CALL RVBOO(RETVAL,ID1,ID2)
  529. C RVBOO JUST STUFFS ID1,ID2 INTO RETVAL ARRAY
  530. C AS 2 INTEGERS.
  531.     RETTYP=TYPE(1,1)
  532.     GOTO 12080
  533. C
  534. C
  535. C
  536. C *** ERROR *** UNIDENTIFIED FUNCTION
  537. 12200    CALL ERRMSG(18)
  538.     GOTO 99000
  539. C
  540. C
  541. C
  542. C
  543. C
  544. C **********************
  545. C ****** OPERATOR ******
  546. C **********************
  547. C
  548. C  I IS INDEX INTO OPER TO TELL WHAT OPERATOR IT IS
  549. 20000    CONTINUE
  550.     RETCD=2
  551.     IF(I.NE.4)GO TO 20050
  552. C
  553. C
  554. C IF AN ASTERISK IS FOUND THE NEXT CHARACTER MUST BE EXAMINED
  555. C TO SEE IF '**' WAS SPECIFIED FOR EXPONENTIATION.
  556.     CALL GETNNB (IPT,RETCD2)
  557.     IF(RETCD2.NE.1)GO TO 99000
  558.     IF (LINE(IPT).NE.STAR) GOTO 20050
  559. C
  560. C
  561. C '**' SPECIFIED (EXPONENTIATION)
  562.     RETTYP=EXCODE
  563.     NONBLK=IPT
  564.     GO TO 12080
  565. C
  566. C
  567. C
  568. C  SET DEFAULT RETTYP FOR OPERATORS
  569. 20050    RETTYP=109+I
  570. C
  571. C
  572. C  CHECK OUT POSSIBLE UNARY OPERATOR "-"
  573.     IF (RETTYP.NE.111) GOTO 20080
  574. C
  575. C
  576. C IF A MINUS IS ENCOUNTERED AND THERE WAS NO PREVIOUS ELEMENT OR
  577. C IF PREVIOUS ELEMENT WAS AN OPERATOR OR = SIGN THEN OPERATOR
  578. C IS UNARY.
  579.     IF (LASTOP.EQ.0.OR.(LASTOP.GE.110.AND.LASTOP.LE.116).OR.
  580.      ;      LASTOP.EQ.200) GOTO 20090
  581. C
  582. C
  583. C  BINARY SUBTRACTION OPERATOR
  584.     RETTYP=116
  585.     GOTO 12080
  586. C
  587. C
  588. C
  589. C SEE IF A '+' SIGN
  590. 20080    IF(RETTYP.NE.115)GO TO 20085
  591. C
  592. C
  593. C DETERMINE IF IT IS A UNARY PLUS
  594.     IF(LASTOP.NE.0.AND.LASTOP.LE.100)GO TO 20085
  595. C
  596. C
  597. C SEE IF LAST OPERATOR WAS ')'
  598.     IF(LASTOP.EQ.117)GO TO 20085
  599. C
  600. C
  601. C UNARY '+' FOUND.
  602.     RETCD=1
  603.     GO TO 10
  604. C
  605. C
  606. C
  607. C RESET LASTOP TO 0 IF LEFT PARENTHESIS IS FOUND (CODE 110)
  608. C IF RETTYP IS FOR =, SET TO PROPER CODE
  609. 20085    IF(RETTYP.EQ.110)GO TO 20090
  610.     IF(RETTYP.EQ.118)RETTYP=200
  611.     GO TO 12080
  612. C
  613. C
  614. C UNARY -
  615. 20090    CONTINUE
  616.     GOTO 99097
  617. C
  618. C
  619. C
  620. C
  621. C
  622. C
  623. C *************************
  624. C ****** NON-DECIMAL ******
  625. C *************************
  626. C
  627. 30000    RETPT=RETPT+1
  628.     IF (RETPT.LE.19) GOTO 30020
  629. C
  630. C
  631. C *** ERROR *** MULTIPLE PRECISION IS LIMITED TO 19 DIGITS
  632. C (ACTUALLY, NO LONGER PRESENT...)
  633.     CALL ERRMSG(22)
  634.     GOTO 99000
  635. C
  636. C
  637. C  I HOLDS INDEX INTO DIGITS THAT WAS A MATCH.
  638. C  SEE IF VALUE OF DIGIT IMPLIES A HIGHER BASE.
  639. 30020    IF (I.NE.16) GOTO 30030
  640.     I=0
  641.     GOTO 30050
  642. 30030    IF (I.EQ.8.OR.I.EQ.9) B10=1
  643.     IF(I.GT.9) B16=1
  644. 30050    RETVAL(RETPT)=CHAR(I)
  645. C
  646. C
  647. C GET NEXT CHARACTER
  648.     CALL GETNNB (IPT,RETCD2)
  649.     IF (RETCD2.NE.1) GOTO 30100
  650.     NONBLK=IPT
  651.     CHAR1=LINE(IPT)
  652.     DO 30070 I=1,16
  653.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  654. 30070    CONTINUE
  655.     IF (CHAR1.EQ.DOT) GOTO 40000
  656.     NONBLK=NONBLK-1
  657. 30100    CONTINUE
  658. C
  659.     IF (DEFBAS.EQ.16.OR.B16.EQ.1) GOTO 30200
  660.     IF (DEFBAS.EQ.10.OR.B10.EQ.1) GOTO 30300
  661. C
  662. c add code here to check for non -calc mode and goto 40000 if so
  663. c if defbas.ne.8 and if we're working on a floating number
  664. C
  665. C *****************************
  666. C ****** BASE 8 CONSTANT ******
  667. C *****************************
  668.     BASE=8
  669. C
  670. C
  671. C IF MORE THAN 10 DIGITS IT IS MULTIPLE PRECISION
  672.     IF (RETPT.GT.10) GOTO 30170
  673.     RETTYP=8
  674. C
  675. C
  676. C  CONVERT TO OCTAL, HEX OR INTEGER
  677. 30110    INT=0
  678. 30130    DO 30132 L=1,7
  679.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 30140
  680. 30132    CONTINUE
  681. 30140    DO 30150 I=L,RETPT
  682.     INT=INT*BASE+ICHAR(RETVAL(I))
  683.     RETVAL(I)=0
  684. 30150    CONTINUE
  685.     RETVAL(20)=0
  686. 30155    DO 30160 I=1,4
  687. 30160    RETVAL(I)=FOUR(I)
  688.     GOTO 35100
  689. C
  690. C
  691. C ************************************************
  692. C ****** MULTIPLE PRECISION BASE 8 CONSTANT ******
  693. C ************************************************
  694. 30170    RETTYP=6
  695. 30180    CALL FLIP (RETVAL,8,RETPT)
  696. c was 20 above, not 8 but we shortened stack arrays so shorten this
  697.     GOTO 35100
  698. C
  699. C
  700. C
  701. C *********************
  702. C ****** BASE 16 ******
  703. C *********************
  704. 30200    BASE=16
  705. C
  706. C
  707. C IF MORE THAN 7 DIGITS IT IS MULTIPLE PRECISION.
  708.     IF (RETPT.GT.7) GOTO 30270
  709. C
  710. C
  711. C
  712. C  HEXADECIMAL
  713.     RETTYP=3
  714.     GOTO 30110
  715. C
  716. C
  717. C
  718. C
  719. C ****************************************
  720. C ****** MULTIPLE PRECISION BASE 16 ******
  721. C ****************************************
  722. 30270    RETTYP=7
  723.     GOTO 30180
  724. C
  725. C
  726. C *********************
  727. C ****** BASE 10 ******
  728. C *********************
  729. 30300    BASE=10
  730. C
  731. C
  732. C IF MORE THAN 9 DIGITS IT IS MULTIPLE PRECISION.
  733.     IF (RETPT.GT.9) GOTO 30370
  734. C
  735. C
  736. C  INTEGER
  737.     RETTYP=4
  738.     GOTO 30110
  739. C
  740. C
  741. C ****************************************
  742. C ****** MULTIPLE PRECISION BASE 10 ******
  743. C ****************************************
  744. 30370    RETTYP=5
  745.     GOTO 30180
  746. C
  747. C
  748. C
  749. C
  750. C
  751. C SET LASTOP AND EXIT
  752. 35100    LASTOP=RETTYP
  753.     GOTO 99099
  754. C
  755. C
  756. C *****************************
  757. C ****** REAL OR DECIMAL ******
  758. C *****************************
  759. 40000    IF (B16.NE.1) GOTO 40020
  760. C
  761. C
  762. C *** ERROR ***  '.' MAY ONLY BE USED WITH BASE 10
  763.     CALL ERRMSG(21)
  764.     GOTO 99000
  765. C
  766. C
  767. C
  768. 40020    IF (RETPT.EQ.0) GOTO 40200
  769. C
  770. C
  771. C IGNORE LEADING ZEROES
  772.     DO 40022 L=1,19
  773.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 40030
  774. 40022    CONTINUE
  775. C
  776. C IF ALL ZEROES THE LAST ONE COUNTS!
  777.     L=19
  778. C
  779. C
  780. C CONVERT TO A REAL*8 NUMBER
  781. 40030    CONTINUE
  782.     REAL=0.D0
  783.     DO 40060 I=L,RETPT
  784.     REAL=REAL*10.D0+ICHAR(RETVAL(I))
  785.     RETVAL(I)=0
  786. 40060    CONTINUE
  787. C
  788. C
  789. C  PICK UP FRACTIONAL PART OF REAL (DECIMAL)
  790. 40200    CONTINUE
  791.     RB=1.0D0
  792.     RETTYP=2
  793. 40205    CALL GETNNB (IPT,RETCD2)
  794.     IF (RETCD2.EQ.1) GOTO 40300
  795. C
  796. C IF NO MORE, YOU GOT IT ALL SO GO PLACE VALUE IN RETVAL.
  797.     GOTO 40537
  798. C
  799. C
  800. C
  801. 40300    NONBLK=IPT
  802.     CHAR1=LINE(IPT)
  803.     DO 40320 I=1,10
  804.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40330
  805. 40320    CONTINUE
  806.     GOTO 40350
  807. 40330    IF (I.EQ.10) I=0
  808.     RB=0.1D0*RB
  809.     REAL=REAL+DFLOAT(I)*RB
  810.     GOTO 40205
  811. C
  812. C
  813. C CHECK TO SEE IF E OR D EXPONENT SPECIFICATION IS USED.
  814. 40350    IF (CHAR1.EQ.DIGITS(13,3).OR.CHAR1.EQ.DIGITS(14,3)) GOTO 40360
  815.     NONBLK=NONBLK-1
  816.     GO TO 40537
  817. C
  818. C
  819. C *********************************************
  820. C ****** E AND D EXPONENT SPECIFICATIONS ******
  821. C *********************************************
  822. 40360    CONTINUE
  823.     CALL GETNNB(IPT,RETCD2)
  824.     IF (RETCD2.EQ.1) GOTO 40370
  825. C
  826. C
  827. C *** ERROR *** ILLEGAL REAL EXPONENT FIELD SPECIFIED
  828. 40365    CALL ERRMSG (24)
  829.     GOTO 99000
  830. C
  831. C
  832. 40370    CHAR1=LINE(IPT)
  833.     IF (CHAR1.EQ.MINUS) GOTO 40380
  834.     RB=10.D0
  835.     IF (CHAR1.NE.PLUS) GOTO 40400
  836.     GOTO 40390
  837. 40380    RB=0.1D0
  838. C
  839. C
  840. C
  841. 40390    NONBLK=IPT
  842.     CALL GETNNB (IPT,RETCD2)
  843. 40400    IF (RETCD2.GE.2) GOTO 40365
  844.     NONBLK=IPT
  845.     CHAR1=LINE(IPT)
  846.     DO 40450 I=1,10
  847.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40480
  848. 40450    CONTINUE
  849.     GOTO 40365
  850. 40480    IF (I.EQ.10) I=0
  851. C
  852. C
  853. C I1 HOLDS 1ST DIGIT OF EXPONENT SPECIFICATION
  854.     I1=I
  855.     CALL GETNNB (IPT,RETCD2)
  856.     IF (RETCD2.GE.2) GOTO 40550
  857.     CHAR1=LINE(IPT)
  858.     NONBLK=IPT
  859.     DO 40500 I=1,10
  860.     IF(CHAR1.EQ.DIGITS(I,1)) GO TO 40520
  861. 40500    CONTINUE
  862.     NONBLK=NONBLK-1
  863.     GOTO 40550
  864. C
  865. C
  866. C I2 HOLDS SECOND DIGIT OF EXPONENT SPECIFICATION.
  867. 40520    IF (I.EQ.10) I=0
  868.     I2=I
  869. C
  870. C
  871. 40530    RETTYP=9
  872.     REAL=REAL*RB**(I1*10+I2)
  873. C
  874. C
  875. C
  876. C ***************************************************
  877. C ****** COPY REAL*8 INTO RETURN VECTOR RETVAL ******
  878. C ***************************************************
  879. 40537    DO 40540 I=1,8
  880. 40540    RETVAL(I)=EIGHT(I)
  881.     GOTO 35100
  882. C
  883. C
  884. C
  885. 40550    I2=I1
  886.     I1=0
  887.     GOTO 40530
  888. C
  889. C
  890. C
  891. C ********************************
  892. C ******* ERROR PROCESSING *******
  893. C ********************************
  894. 99000    CONTINUE
  895.     IV=LEND-NONBLK+1
  896.     CALL VWRT(LINE(NONBLK),IV)
  897. C    WRITE (0,99010) (LINE(I),I=NONBLK,LEND)
  898. C99010    FORMAT (1X,80(A1,\))
  899.     RETCD=4
  900. 99097    LASTOP=0
  901. 99099    RETURN
  902.     END
  903. c -h- pget.for    Tue Sep  2 10:58:55 1986    
  904.     SUBROUTINE PGET(CMDLIN,ICODE,IRTN)
  905. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  906. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  907. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  908. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  909. C FROM THE DISK BASED FILE HERE.
  910.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  911.     INTEGER*4 VNLT
  912.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  913.     COMMON/NMSH/NMSH
  914.     REAL*8 XVBLS(1,1)
  915.     INTEGER KPYBAK
  916. C ***<<<< RDD COMMON START >>>***
  917.     InTeGer*4 RRWACT,RCLACT
  918. C    COMMON/RCLACT/RRWACT,RCLACT
  919.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  920.      1  IDOL7,IDOL8
  921. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  922. C     1  IDOL7,IDOL8
  923.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  924. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  925.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  926. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  927. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  928. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  929.     InTeGer*4 KLVL
  930. C    COMMON/KLVL/KLVL
  931.     InTeGer*4 IOLVL,IGOLD
  932. C    COMMON/IOLVL/IOLVL
  933. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  934. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  935.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  936.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  937.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  938. C ***<<< RDD COMMON END >>>***
  939. CCC    InTeGer*4 IOLVL
  940.     INTEGER*4 JVBLS(2,1,1)
  941. CCC    COMMON/IOLVL/IOLVL
  942. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  943. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  944.     DIMENSION FORM(128),FVLD(1,1)
  945.     CHARACTER*1 FVWRK,FVWRK2
  946. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  947. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  948. C SO INITIALLY IGNORE.
  949. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  950. C
  951. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  952.  
  953. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  954.     CHARACTER*1 LETA
  955. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  956. CCC    InTeGer*4 LLCMD,LLDSP
  957. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  958.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  959.     COMMON/D2R/NRDSP,NCDSP
  960.     InTeGer*4 TYPE(1,1),VLEN(9)
  961.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  962.     REAL*8 XAC,ZAC
  963.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  964.     REAL*8 XXAC,XYAC
  965.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  966. C ***<<< XVXTCD COMMON START >>>***
  967.     CHARACTER*1 OARRY(100)
  968.     InTeGer*4 OSWIT,OCNTR
  969. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  970. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  971.     InTeGer*4 IPS1,IPS2,MODFLG
  972. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  973.        InTeGer*4 XTCFG,IPSET,XTNCNT
  974.        CHARACTER*1 XTNCMD(80)
  975. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  976. C VARY FLAG ITERATION COUNT
  977.     INTEGER KALKIT
  978. C    COMMON/VARYIT/KALKIT
  979.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  980.     InTeGer*4 RCMODE,IRCE1,IRCE2
  981. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  982. C     1  IRCE2
  983. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  984. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  985. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  986. C RCFGX ON.
  987. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  988. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  989. C  AND VM INHIBITS. (SETS TO 1).
  990.     INTEGER*4 FH
  991. C FILE HANDLE FOR CONSOLE I/O (RAW)
  992. C    COMMON/CONSFH/FH
  993.     CHARACTER*1 ARGSTR(52,4)
  994. C    COMMON/ARGSTR/ARGSTR
  995.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  996.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  997.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  998.      3  IRCE2,FH,ARGSTR
  999. C ***<<< XVXTCD COMMON END >>>***
  1000. CCC    CHARACTER*1 ARGSTR(52,4)
  1001. CCC    COMMON/ARGSTR/ARGSTR
  1002. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  1003. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  1004. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  1005. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  1006. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  1007. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  1008.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1009.     INTEGER*4 IIRO,IICO,INUMEM
  1010. C NEED SOME BIG VARIABLES FOR SAVING THE MAPPINGS
  1011.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  1012.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1013. CCC    COMMON/KLVL/KLVL
  1014.     CHARACTER*1 DEFVB(12)
  1015.     COMMON/DEFVBX/DEFVB
  1016. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1017. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  1018. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1019. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1020. C  AND VM INHIBITS. (SETS TO 1).
  1021. C
  1022. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1023. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1024. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1025. C DISPLAY ACTUALLY USED FOR SCREEN.
  1026.     InTeGer*4 CWIDS(20)
  1027. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1028. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1029. C AS 20 NOT 75.
  1030.     REAL*8 DVS(20,75)
  1031.     INTEGER*4 LDVS(2,20,75)
  1032.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1033.     CHARACTER*76 CFORM
  1034.     EQUIVALENCE(CFORM(1:1),FORM(1))
  1035.     COMMON /FVLDC/FVLD
  1036. C    CHARACTER*1 DFMTS(10,20,75)
  1037. C 10 CHARACTERS PER ENTRY.
  1038.     COMMON/DSPCMN/DVS,CWIDS
  1039. C ***<<< NULETC COMMON START >>>***
  1040.     InTeGer*4 ICREF,IRREF
  1041. C    COMMON/MIRROR/ICREF,IRREF
  1042.     InTeGer*4 MODPUB,LIMODE
  1043. C    COMMON/MODPUB/MODPUB,LIMODE
  1044.     InTeGer*4 KLKC,KLKR
  1045.     REAL*8 AACP,AACQ
  1046. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  1047.     InTeGer*4 NCEL,NXINI
  1048. C    COMMON/NCEL/NCEL,NXINI
  1049.     CHARACTER*1 NAMARY(20,301)
  1050. C    COMMON/NMNMNM/NAMARY
  1051.     InTeGer*4 NULAST,LFVD
  1052. C    COMMON/NULXXX/NULAST,LFVD
  1053.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  1054.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  1055. C ***<<< NULETC COMMON END >>>***
  1056. CCC    InTeGer*4 ICREF,IRREF
  1057. CCC    COMMON/MIRROR/ICREF,IRREF
  1058. C ENCODE ICREF, IRREF AND CWIDS PAST TITLE IN FIRST LINE
  1059. C (THAT WAY, NOTHING BREAKS IN OTHER PGMS THAT USE THIS)
  1060. C
  1061. C PUT NUMBERS OUT TO FILE
  1062. C USES RELATIVE FORMS TO CURRENT POS.
  1063. C PD = PUT OURT DISPLAY SHEET. PP = PUT OUT PHYSICAL SHEET.
  1064. C ONLY WRITES PHYSICALLY PRESENT DATA.
  1065. C P/D RRR,CCC,FORMULA,VALID,FORMAT
  1066. C N IN 3RD CHR (PPN/PDN) SAVES NUMBERS, ELSE FORMULAS.
  1067.     ICODE=1
  1068.     CLOSE(4)
  1069. 7954    CALL UVT100(1,LLCMD,1)
  1070.     CALL UVT100(12,2,0)
  1071. C ASK FOR FILE NAME
  1072.     CALL VWRT('Enter Filename>',15)
  1073.     III=IOLVL
  1074. C    IF(III.EQ.5)III=0
  1075.     READ(III,7953,END=510,ERR=510)FORM2
  1076. c7952    FORMAT(' Enter filename>\')
  1077. 7953    FORMAT(128A1)
  1078.     DO 6940 II=1,128
  1079.     ILN=129-II
  1080.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  1081.     FORM2(ILN)=0
  1082. 6940    CONTINUE
  1083. 6941    CONTINUE
  1084. C ILN IS LENGTH OFLINE NOW.
  1085.     ILN=MIN0(ILN,127)
  1086.     FORM2(ILN+1)=0
  1087.     CALL WASSIG(4,FORM2)
  1088. C NOW ENCODE COL WIDTHS AND ICREF/IRREF
  1089. C SO SAVE/RESTORE OF EXTENDED SHEETS DOESN'T GET
  1090. C MESSED UP.
  1091.     WRITE(CFORM(1:76),8850,ERR=8851)ICREF,IRREF,(CWIDS(III),
  1092.      1  III=1,20),DRWV,DCLV
  1093. 8850    FORMAT(24I3)
  1094.     DO 8855 III=1,80
  1095.     II=ICHAR(NMSH(III))
  1096.     IF(II.LT.32)II=32
  1097. 8855    NMSH(III)=CHAR(II)
  1098. 8851    CONTINUE
  1099.     WRITE(4,6951)NMSH,(FORM(II),II=1,76)
  1100. 6951    FORMAT(80A1,76A1)
  1101. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  1102.     CALL UVT100(1,LLCMD,1)
  1103.     CALL UVT100(12,2,0)
  1104.     CALL VWRT('Enter max. displ down to save or 0 for all>',43)
  1105.     III=IOLVL
  1106. C    IF(III.EQ.5)III=0
  1107.     READ(III,7978,END=510,ERR=510)LDXM
  1108. 6950    FORMAT(80A1)
  1109. 7978    FORMAT(I7)
  1110.     CALL UVT100(1,LLCMD,1)
  1111.     CALL UVT100(12,2,0)
  1112.     CALL VWRT('Enter max. displcmt right to save or 0 for all>',47)
  1113.     III=IOLVL
  1114. C    IF(III.EQ.5)III=0
  1115.     READ(III,7978,END=510,ERR=510)MDXM
  1116.     IF(MDXM.LE.0)MDXM=12000
  1117.     IF(LDXM.LE.0)LDXM=12000
  1118. C 12000 IS "AN ARBITRARILY LARGE NUMBER TO ASSURE THAT ALL VALID
  1119. C RANGES ARE SAVED". IT MUST BE SMALL ENOUGH TO ASSURE WE DON'T OVERFLOW AN
  1120. C INTEGER THOUGH.
  1121.     IF(CMDLIN(2).NE.'P'.and.CMDLIN(2).GT.' ')GOTO 7950
  1122. C TREAT "P" BY ITSELF AS A SAVE PP TYPE COMMAND (PUT PHYS)
  1123.     DO 7951 ICO=PCOL,301
  1124.     DO 7951 IRO=PROW,60
  1125. C GO DOWN AND RIGHT ONLY. ALLOW MIXING THIS WAY.
  1126. C    IRX=(ICO-1)*60+IRO
  1127.     CALL REFLEC(ICO,IRO,IRX)
  1128.     IDRO=IRO-PROW+1
  1129.     IDCL=ICO-PCOL+1
  1130.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7951
  1131. C FORM DISPLACEMENT LOCATORS
  1132.     CALL FVLDGT(IRO,ICO,FVLD(1,1))
  1133.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7951
  1134.     CALL WRKFIL(IRX,FORM,0)
  1135.     CALL CE2A(FORM,FORM2)
  1136.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1137.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1138.     CALL TYPGET(IRO,ICO,TYPE(1,1))
  1139.     IF(CMDLIN(3).NE.'N')GOTO 5402
  1140.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5402
  1141. C ALWAYS WRITE TEXT OUT EVEN IF SAVING NUMERICALLY
  1142. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  1143. C INTERNAL PROC TO PRINT NUMERIC VALUES AT 6400
  1144.     LETR='P'
  1145.     ASSIGN 5405 TO INUMEM
  1146. C    GOTO 6400
  1147. 6400    CONTINUE
  1148. C ASSUME LETR IS SET TO GOOD PREFIX LETTER ASCII VALUE
  1149.     CALL XVBLGT(IRO,ICO,XVBLS(1,1))
  1150.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5403)LETR,IDRO,IDCL,
  1151.      1  JVBLS(1,1,1)
  1152. 5403    FORMAT(1A1,I5,',',I5,',',I15)
  1153.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5404)LETR,IDRO,IDCL,
  1154.      1  XVBLS(1,1)
  1155. 5404    FORMAT(1A1,I5,',',I5,',',D30.19)
  1156.     GOTO INUMEM,(5405,6406)
  1157. 5402    CONTINUE
  1158. C FIND END OF TEXT IN ARRAY
  1159.     DO 4330 IV=2,110
  1160.     IVVV=113-IV
  1161.     IF(ICHAR(FORM2(IVVV)).GT.32)GOTO 4331
  1162. 4330    CONTINUE
  1163. 4331    CONTINUE
  1164. C SAVE ON PPX IN EFFICIENT FORM.
  1165. C DON'T WRITE OUT TRAILING NULLS.
  1166. C ENSURE FORMAT HAS NO NULLS IN IT.
  1167.     DO 358 IV=120,128
  1168. 358    IF(ICHAR(FORM2(IV)).LT.32)FORM2(IV)=Char(32)
  1169.     IF(CMDLIN(3).EQ.'F')GOTO 6404
  1170. C PPF WILL SAVE FORMULAS ONLY
  1171. C PPA WILL SAVE FORMULAS AND VALUES (AS WILL PPc WHERE c IS
  1172. C ANY CHARACTER EXCEPT N.
  1173.     LETR='p'
  1174. C FLAG NUMERIC SAVE VIA LOWERCASE P HERE
  1175.     ASSIGN 6406 TO INUMEM
  1176. C GO WRITE FIRST LINE NUMERICALLY
  1177.     GOTO 6400
  1178. 6406    CONTINUE
  1179. C NOW HAVE NUMERIC LINE WRITTEN. WRITE THE SECOND LINE OF THE
  1180. C GROUP TO, SO AS NOT TO CONFUSE GRAPHICS PROGRAMS AND THE
  1181. C LIKE.
  1182.     III=JCHAR(FORM2(119))
  1183.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1184. 6404    CONTINUE
  1185. C NOW WRITE OUT FORMULA RECORD.
  1186.     WRITE(4,7955)IDRO,IDCL,(FORM2(IV),IV=1,IVVV)
  1187. 5405    CONTINUE
  1188. C DUMP TO SERIAL FILE IN OUR OWN FORMAT, BUT ALL IN ASCII.
  1189. 7955    FORMAT('P',I5,',',I5,',',128A1)
  1190. C NOTE LONG RECORDS.
  1191.     III=JCHAR(FORM2(119))
  1192.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1193. 7956    FORMAT(I3,',',9A1,',',I5)
  1194. 7951    CONTINUE
  1195. 2751    CONTINUE
  1196. C
  1197. C NOW SAVE NRDSP AND NCDSP MAPPINGS TOO
  1198. C ONLY SAVE MAPPINGS IF 4TH COMMAND CHARACTER IS "M".
  1199. C ... THEY TAKE A LOT OF ROOM.
  1200.     IF (CMDLIN(4).NE.'M') GOTO 6541
  1201.     DO 6540 IRO=DROW,20
  1202.     DO 6540 ICO=DCOL,75
  1203.     IIRO=64000
  1204.     IICO=IIRO
  1205.     IIRO=IIRO+IRO
  1206.     IICO=IICO+ICO
  1207. C NOTE WE MAKE THESE NUMBERS LARGE SO GRAPHING PROGRAMS WON'T TRY
  1208. C TO READ THEM.
  1209. 6955    FORMAT('M',I5,',',I5,',',2I7)
  1210.     WRITE(4,6955,ERR=6541)IIRO,IICO,NRDSP(IRO,ICO),
  1211.      1  NCDSP(IRO,ICO)
  1212. C WRITE A SPECIAL RECORD, FLAGGED BY 'M', TO SAVE A MAPPING CELL
  1213. C NEED A 2ND RECORD TOO; JUST SEND LAST ONE AGAIN.
  1214.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1215. 6540    CONTINUE
  1216. 6541    CONTINUE
  1217.     CLOSE(4)
  1218.     GOTO 9990
  1219. 7950    IF(CMDLIN(2).NE.'D')GOTO 9990
  1220.     DO 7957 ICO=DCOL,75
  1221.     DO 7957 IRO=DROW,20
  1222.     IDRO=IRO-DROW+1
  1223.     IDCL=ICO-DCOL+1
  1224.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7957
  1225.     NR=NRDSP(IRO,ICO)
  1226.     NC=NCDSP(IRO,ICO)
  1227. C    IRX=(NC-1)*60+NR
  1228.     CALL REFLEC(NC,NR,IRX)
  1229.     CALL FVLDGT(NR,NC,FVLD(1,1))
  1230.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7957
  1231.     CALL WRKFIL(IRX,FORM,0)
  1232.     CALL CE2A(FORM,FORM2)
  1233.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1234.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1235.     IF(CMDLIN(3).NE.'N')GOTO 5412
  1236. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  1237.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5412
  1238. C WRITE LABELS EVEN IF NUMERIC SAVE
  1239.     CALL TYPGET(NR,NC,TYPE(1,1))
  1240.     CALL XVBLGT(NR,NC,XVBLS(1,1))
  1241.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5413)IDRO,IDCL,JVBLS(1,1,1)
  1242. 5413    FORMAT('P',I5,',',I5,',',I15)
  1243.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5414)IDRO,IDCL,XVBLS(1,1)
  1244. 5414    FORMAT('P',I5,',',I5,',',D30.19)
  1245.     GOTO 5415
  1246. 5412    CONTINUE
  1247.     WRITE(4,7958)IDRO,IDCL,(FORM2(IV),IV=1,110)
  1248. 5415    CONTINUE
  1249. 7958    FORMAT('D',I5,',',I5,',',128A1)
  1250.     DO 359 IV=120,128
  1251. 359    IF(FORM2(IV).LT.' ')FORM2(IV)=Char(32)
  1252.     III=JCHAR(FORM2(119))
  1253.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1254. 7957    CONTINUE
  1255. C ALLOW SAVE AS NEEDED OF MAPPING
  1256.     GOTO 2751
  1257. C    CLOSE(4)
  1258. 9990    RETURN
  1259. 510    CONTINUE
  1260.     IRTN=1
  1261.     CLOSE(IOLVL)
  1262.     CLOSE(11)
  1263.     OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  1264.     RETURN
  1265.     END
  1266. c -h- pgget.for    Tue Sep  2 10:58:55 1986    
  1267.     SUBROUTINE PGGET(CMDLIN,ICODE,IRTN)
  1268. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1269. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1270. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1271. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1272. C FROM THE DISK BASED FILE HERE.
  1273.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  1274.     INTEGER*4 VNLT
  1275.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  1276.     COMMON/NMSH/NMSH
  1277.     REAL*8 XVBLS(1,1)
  1278.     INTEGER KPYBAK
  1279. C ***<<<< RDD COMMON START >>>***
  1280.     InTeGer*4 RRWACT,RCLACT
  1281. C    COMMON/RCLACT/RRWACT,RCLACT
  1282.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1283.      1  IDOL7,IDOL8
  1284. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1285. C     1  IDOL7,IDOL8
  1286.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1287. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1288.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1289. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1290. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1291. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1292.     InTeGer*4 KLVL
  1293. C    COMMON/KLVL/KLVL
  1294.     InTeGer*4 IOLVL,IGOLD
  1295. C    COMMON/IOLVL/IOLVL
  1296. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1297. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1298.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1299.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1300.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1301. C ***<<< RDD COMMON END >>>***
  1302. CCC    InTeGer*4 IOLVL
  1303.     INTEGER*4 JVBLS(2,1,1)
  1304.     REAL*8 R8WK
  1305. CCC    COMMON/IOLVL/IOLVL
  1306. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1307. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1308.     DIMENSION FORM(128),FVLD(1,1)
  1309.     INTEGER*4 IRRW,ICCL
  1310. C USE BIG NUMBERS SO WE CAN SUBTRACT 64000 AND STILL NOT GET WRAPAROUND.
  1311. C (FOR SAVE/RESTORE OF MAP)
  1312.     CHARACTER*76 CFORM
  1313.     CHARACTER*35 CFORM2
  1314.     EQUIVALENCE(CFORM2(1:1),FORM2(1))
  1315.     EQUIVALENCE(CFORM(1:1),FORM(1))
  1316.     InTeGer*4 NDUM(24)
  1317. C ***<<< NULETC COMMON START >>>***
  1318.     InTeGer*4 ICREF,IRREF
  1319. C    COMMON/MIRROR/ICREF,IRREF
  1320.     InTeGer*4 MODPUB,LIMODE
  1321. C    COMMON/MODPUB/MODPUB,LIMODE
  1322.     InTeGer*4 KLKC,KLKR
  1323.     REAL*8 AACP,AACQ
  1324. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  1325.     InTeGer*4 NCEL,NXINI
  1326. C    COMMON/NCEL/NCEL,NXINI
  1327.     CHARACTER*1 NAMARY(20,301)
  1328. C    COMMON/NMNMNM/NAMARY
  1329.     InTeGer*4 NULAST,LFVD
  1330. C    COMMON/NULXXX/NULAST,LFVD
  1331.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  1332.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  1333. C ***<<< NULETC COMMON END >>>***
  1334. CCC    COMMON/MIRROR/ICREF,IRREF
  1335.     CHARACTER*1 FVWRK,FVWRK2
  1336. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  1337. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  1338. C SO INITIALLY IGNORE.
  1339. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  1340. C
  1341. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  1342. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  1343. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1344. CCC    InTeGer*4 LLCMD,LLDSP
  1345. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1346.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1347.     EXTERNAL INDX
  1348.     COMMON/D2R/NRDSP,NCDSP
  1349.     InTeGer*4 TYPE(1,1),VLEN(9)
  1350.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1351.     REAL*8 XAC,ZAC
  1352.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  1353.     REAL*8 XXAC,XYAC
  1354.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  1355. C ***<<< XVXTCD COMMON START >>>***
  1356.     CHARACTER*1 OARRY(100)
  1357.     InTeGer*4 OSWIT,OCNTR
  1358. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1359. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1360.     InTeGer*4 IPS1,IPS2,MODFLG
  1361. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1362.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1363.        CHARACTER*1 XTNCMD(80)
  1364. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1365. C VARY FLAG ITERATION COUNT
  1366.     INTEGER KALKIT
  1367. C    COMMON/VARYIT/KALKIT
  1368.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1369.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1370. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1371. C     1  IRCE2
  1372. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1373. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1374. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1375. C RCFGX ON.
  1376. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1377. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1378. C  AND VM INHIBITS. (SETS TO 1).
  1379.     INTEGER*4 FH
  1380. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1381. C    COMMON/CONSFH/FH
  1382.     CHARACTER*1 ARGSTR(52,4)
  1383. C    COMMON/ARGSTR/ARGSTR
  1384.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1385.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1386.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1387.      3  IRCE2,FH,ARGSTR
  1388. C ***<<< XVXTCD COMMON END >>>***
  1389. CCC    CHARACTER*1 ARGSTR(52,4)
  1390. CCC    COMMON/ARGSTR/ARGSTR
  1391. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  1392. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  1393. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  1394. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  1395. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  1396. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  1397.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1398.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  1399.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1400. CCC    COMMON/KLVL/KLVL
  1401.     CHARACTER*1 DEFVB(12)
  1402.     COMMON/DEFVBX/DEFVB
  1403. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1404. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  1405. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1406. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1407. C  AND VM INHIBITS. (SETS TO 1).
  1408. C
  1409. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1410. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1411. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1412. C DISPLAY ACTUALLY USED FOR SCREEN.
  1413.     InTeGer*4 CWIDS(20)
  1414. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1415. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1416. C AS 20 NOT 75.
  1417.     REAL*8 DVS(20,75)
  1418.     INTEGER*4 LDVS(2,20,75)
  1419.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1420.     COMMON /FVLDC/FVLD
  1421. CCC    InTeGer*4 NCEL,NXINI
  1422. CCC    COMMON/NCEL/NCEL,NXINI
  1423. C    CHARACTER*1 DFMTS(10,20,75)
  1424. C 10 CHARACTERS PER ENTRY.
  1425.     COMMON/DSPCMN/DVS,CWIDS
  1426. C
  1427. c7952    FORMAT(' Enter filename>\')
  1428. 7953    FORMAT(128A1)
  1429. 6950    FORMAT(80A1)
  1430. 7978    FORMAT(I7)
  1431. 7956    FORMAT(I3,1X,9A1,1X,I5)
  1432.     CLOSE(4)
  1433. 7960    CALL UVT100(1,LLCMD,1)
  1434.     CALL UVT100(12,2,0)
  1435. C GET FILE NAME
  1436.     call Vwrt('Enter Filename>',15)
  1437.     III=IOLVL
  1438. C    IF(III.EQ.5)III=0
  1439.     READ(III,7953,END=510,ERR=510)FORM2
  1440.     DO 6940 II=1,128
  1441.     ILN=129-II
  1442.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  1443.     FORM2(ILN)=Char(0)
  1444. 6940    CONTINUE
  1445. 6941    CONTINUE
  1446. C ILN IS LENGTH OFLINE NOW.
  1447.     ILN=MIN0(127,ILN)
  1448.     FORM2(ILN+1)=Char(0)
  1449. C SPECIAL "FAST READ" MODE TO SET UP DATA AREAS ON GETTING OLD SHEETS...
  1450.     NXINI=1
  1451.     LDXM=INDX(FORM2,ICHAR('/'))
  1452. C IF FILE IS FILENAME/M WE WON'T DO IT FAST...
  1453.     IF(LDXM.LE.0.OR.LDXM.GE.ILN)GOTO 8400
  1454.     FORM2(LDXM)=Char(0)
  1455. C TERMINATE AFTER THE / AND SET NXINI TO 0 AGAIN
  1456.     NXINI=0
  1457. 8400    CONTINUE
  1458.     CALL RASSIG(4,FORM2)
  1459.     READ(4,6951,END=7964,ERR=7964)NMSH,FORM
  1460. 6951    FORMAT(80A1,76A1,56A1)
  1461. 6952    FORMAT(24I3)
  1462. C TRY TO DECODE ICREF,IRREF, CWIDS, AND DRWV,DCLV
  1463.     READ(CFORM(1:76),6952,ERR=6953)NDUM
  1464. C IF HERE, THE READ WAS OK (APPARENTLY)
  1465. C FILL IN DEFAULTS IF NOTHING BUT ZEROES REALLY WAS SEEN
  1466. C (OR JUST ALL SPACES)
  1467.     ICREF=NDUM(1)
  1468.     IF(ICREF.LE.0.OR.ICREF.GT.60)ICREF=10
  1469.     IRREF=NDUM(2)
  1470.     IF(IRREF.LE.0.OR.IRREF.GT.300)IRREF=50
  1471. C SET UP CWIDS BUT DEFAULT TO 10 IF NO REAL INFO THERE
  1472.     DO 6954 III=1,20
  1473.     IIVV=NDUM(III+2)
  1474.     IF(IIVV.LT.1.OR.IIVV.GT.100)IIVV=10
  1475.     CWIDS(III)=IIVV
  1476. 6954    CONTINUE
  1477. C RESTORE NUMBER ROWS AND COLS BEING DISPLAYED
  1478. C NOTE WE DO NOT RESTORE THE COMPLETE DISPLAY
  1479. C MAPPING; JUST THE WIDTHS AND NUMBERS OF DISPLAY
  1480. C COLUMNS, AND WE RESTORE THE EXTENDED MAP SO THAT
  1481. C SAVED SHEETS WILL NORMALLY GET BACK THE SAME EXTENDED
  1482. C ADDRESSING THAT HAD BEEN SET UP.
  1483.     DRWV=NDUM(23)
  1484.     IF(DRWV.LT.1.OR.DRWV.GT.20)DRWV=7
  1485.     DCLV=NDUM(24)
  1486.     IF(DCLV.LT.1.OR.DCLV.GT.75)DCLV=20
  1487. 6953    CONTINUE
  1488. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  1489.     CALL UVT100(1,LLCMD,1)
  1490.     CALL UVT100(12,2,0)
  1491.     CALL VWRT('Enter max. displc. down to restore or 0 for all>',48)
  1492.     III=IOLVL
  1493. C    IF(III.EQ.5)III=0
  1494.     READ(III,7978,END=510,ERR=510)MDXM
  1495.     CALL UVT100(1,LLCMD,1)
  1496.     CALL UVT100(12,2,0)
  1497.     CALL VWRT('Enter max. displc. right to restore or 0 for all>',
  1498.      1  49)
  1499.     READ(III,7978,END=510,ERR=510)LDXM
  1500.     CALL UVT100(1,LLCMD,1)
  1501.     CALL UVT100(12,2,0)
  1502.     CALL VWRT('Enter min. displ. down (1 or more)>',35)
  1503.     READ(III,7978,END=510,ERR=510)MMDXM
  1504.     CALL UVT100(1,LLCMD,1)
  1505.     CALL UVT100(12,2,0)
  1506.     CALL VWRT('Enter min displ. right (1 or more)>',35)
  1507.     READ(III,7978,END=510,ERR=510)LLDXM
  1508.     IF(MDXM.LE.0)MDXM=12000
  1509.     LLDXM=MAX0(1,LLDXM)
  1510.     MMDXM=MAX0(1,MMDXM)
  1511.     IF(LDXM.LE.0)LDXM=12000
  1512.     IF(CMDLIN(4).EQ.'+'.OR.CMDLIN(4).EQ.'-')RCFGX=1
  1513. C ENTER RECALC MANUAL MODE IF ADDING NUMBERS OR SUBT.
  1514. C FROM SAVED SHEET
  1515. C 12000 IS, AS ABOVE, JUST A "BIG" NUMBER.
  1516. 7961    CONTINUE
  1517.     READ(4,7962,END=7964,ERR=7964)LET1,IRRW,ICCL,(FORM2(IV),
  1518.      1  IV=1,110)
  1519. 7962    FORMAT(A1,I5,1X,I5,1X,128A1)
  1520.     DO 4497 IV=1,110
  1521.     IVV=111-IV
  1522.     IF(FORM2(IVV).GT.' ')GOTO 4496
  1523.     FORM2(IVV)=Char(0)
  1524. 4497    CONTINUE
  1525. 4496    CONTINUE
  1526. C ABOVE LOOP ENSURES THAT EXTRA PARTS OF BUFFER NOT IN SAVE FILE ARE
  1527. C ZEROED ON READIN.
  1528.     READ(4,7956,END=7964,ERR=7964)III,(FORM2(IV),IV=120,128),
  1529.      1  KKTYP
  1530.     FORM2(119)=Char(III)
  1531.     IF(LET1.EQ.'M')GOTO 6500
  1532. C M CODE MEANS WE'RE READING THE DISPLAY-TO-PHYSICAL MAP.
  1533. C GO HANDLE IT SPECIALLY, THEN RETURN. FLAGS RECORDS BY
  1534. C ADDING 64000 TO ROW AND COL NUMBERS TO AVOID GETTING
  1535. C GRAPHICS PROGRAMS MESSED UP.
  1536. C  NOTE THAT SAVING THE MAP WAS OPTIONAL AND IS NOT THE
  1537. C DO-NOTHING DEFAULT.
  1538.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1539.     IF(JCHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1540.     IF(IRRW.LE.0.OR.ICCL.LE.0)GOTO 9990
  1541.     IF(IRRW.GT.LDXM.OR.ICCL.GT.MDXM)GOTO 7961
  1542.     IF(IRRW.LT.LLDXM.OR.ICCL.LT.MMDXM) GOTO 7961
  1543. C PRODUCE NEW ADDRESSES IN PHYSICAL SHEET USING SAVED FILE'S ONES
  1544. C AND CURSOR LOCATION (SINCE WE SAVE/RESTORE RELATIVE TO CURSOR).
  1545. C THIS PROVIDES A SHEET PARTIAL SAVE / MERGE CAPABILITY.
  1546.     NR=IRRW+PROW-LLDXM
  1547.     NC=ICCL+PCOL-MMDXM
  1548.     IF(CMDLIN(2).NE.'D'.AND.LET1.NE.68)GOTO 7963
  1549.     IF(CMDLIN(2).EQ.'P')GOTO 7963
  1550. C GET DISPLAY VERSION...
  1551.     LRR=IRRW+DROW-LLDXM
  1552.     LCC=ICCL+DCOL-MMDXM
  1553.     LRR=MAX0(1,LRR)
  1554.     LCC=MAX0(1,LCC)
  1555.     IF(LRR.GT.DRWV.OR.LCC.GT.DCLV)GOTO 7961
  1556.     NR=NRDSP(LRR,LCC)
  1557.     NC=NCDSP(LRR,LCC)
  1558. 7963    CONTINUE
  1559. C LET1='p'WILL COME HERE TOO. HANDLE IT SINCE IT'S NUMERIC STUFF.
  1560. C    IRX=(NC-1)*60+NR
  1561.     CALL REFLEC(NC,NR,IRX)
  1562.     IF(NR.EQ.0.OR.NC.EQ.0)GOTO 7961
  1563.     FORM2(118)=CHAR(15)
  1564.     DO 7113 IVV=1,128
  1565. 7113    FORM(IVV)=FORM2(IVV)
  1566.     INRW=PROW
  1567.     INCL=PCOL
  1568.     JOUTR=1
  1569.     JOUTC=2
  1570. C A1 = OUT LOCATION FOR INPUT CELL NAMES
  1571.     JRTR=1
  1572.     JRTC=1
  1573.     IF(CMDLIN(3).EQ.'R')CALL RELVBL(FORM,FORM2,JOUTR,JOUTC,
  1574.      1  INRW,INCL,JRTR,JRTC)
  1575. C ALLOW RELOCATION ON LOADING SAVED SHEET IF DESIRED.
  1576.     CALL FVLDST(NR,NC,FORM2(119))
  1577. C    FVLD(NR,NC)=FORM2(119)
  1578.     CALL TYPSET(NR,NC,KKTYP)
  1579. C    TYPE(NR,NC)=KKTYP
  1580.     CALL CA2E(FORM2,FORM)
  1581.     IF(LET1.NE.'p')CALL WRKFIL(IRX,FORM,1)
  1582. C    WRITE(7'IRX)FORM2
  1583.     IF(LET1.NE.'p')GOTO 7961
  1584. C HAVE LOWERCASE 'p' NOW AS NUMERIC SAVE FLAG FOR THIS RECORD.
  1585.     READ(CFORM2(1:35),6408,ERR=7961)XVBLS(1,1)
  1586. 6408    FORMAT(BN,D30.19)
  1587.     CALL XVBLGT(NR,NC,R8WK)
  1588.     IF(CMDLIN(4).EQ.'+')XVBLS(1,1)=XVBLS(1,1)+R8WK
  1589.     IF(CMDLIN(4).EQ.'-')XVBLS(1,1)=R8WK-XVBLS(1,1)
  1590. C IMPLEMENT ADDING AND SUBTRACTING SAVED SHEETS FROM CURRENT.
  1591. C GOES TO RECALC MANUAL MODE SINCE RECALC WOULD MESS UP
  1592. C VALUES; FORMULAS GET UPDATED FROM LAST-READ SHEET NORMALLY.
  1593.     CALL XVBLST(NR,NC,XVBLS(1,1))
  1594.     GOTO 7961
  1595. 6500    CONTINUE
  1596. C HERE READ MAPPINGS
  1597.     IRRW=IRRW-64000
  1598.     ICCL=ICCL-64000
  1599. C RESTORE OFFSETS TO NORMAL RANGE
  1600.     READ(CFORM2(1:35),6501,ERR=7961)II,III
  1601. 6501    FORMAT(2I7)
  1602.     NRDSP(IRRW,ICCL)=II
  1603.     NCDSP(IRRW,ICCL)=III
  1604. C GO BACK FOR MORE. INEFFICIENT STORAGE OF MAP BUT IT'S COMPACT
  1605. C CODE...
  1606.     GOTO 7961
  1607. 7964    CONTINUE
  1608.     CLOSE(4)
  1609. 9990    NXINI=0
  1610.     RETURN
  1611. 510    CONTINUE
  1612.     IRTN=1
  1613.     NXINI=0
  1614.     CLOSE(IOLVL)
  1615.     CLOSE(11)
  1616.     OPEN(5,FILE='CON:0/0/100/100/Analy Command')
  1617.     RETURN
  1618.     END
  1619. c -h- pmtx2.for    Tue Sep  2 10:58:55 1986    
  1620.     SUBROUTINE PMTX2(IRTCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  1621.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  1622.     CHARACTER*1 LINE(80)
  1623.     CALL GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  1624.      1  ID2B,RETCD)
  1625. C GET LOC OF MATRIX A (MUST BE SQUARE)
  1626.     IBGN=LSTCHR+1
  1627.     IF(RETCD.NE.0.OR.IMXX.LE.1)GOTO 1000
  1628.     IF(LINE(LSTCHR).NE.',')GOTO 300
  1629.     CALL GMTX(LINE,IBGN,LSTCHR,IDXA,IDXB,IDYA,
  1630.      1  IDYB,RETCD)
  1631. C GET LOC OF MATRIX X (RESULT).
  1632.     IBGN=LSTCHR+1
  1633.     IF(RETCD.NE.0.OR.IMXX.LE.2)GOTO 1000
  1634.     IF(LINE(LSTCHR).NE.',')GOTO 300
  1635.     CALL GMTX(LINE,IBGN,LSTCHR,IDBA,IDBB,IDCA,
  1636.      1  IDCB,RETCD)
  1637.     IBGN=LSTCHR+1
  1638. C GET LOC OF MATRIX B (AX=B), THE OTHER HALF OF OUR GIVENS
  1639. C IF WE FALL TO HERE, ALL LOOKS OK, SO LEAVE RETCD ALONE.
  1640. C HOWEVER IF ANY ERRS HAVE OCCURRED, RETCD IS ALREADY SET TO 3
  1641. C FOR ERROR...
  1642. 1000    RETURN
  1643. 300    CONTINUE
  1644.     RETCD=3
  1645.     RETURN
  1646.     END
  1647. c -h- postvl.for    Tue Sep  2 10:58:55 1986    
  1648.     SUBROUTINE POSTVL (RETCD)
  1649. C COPYRIGHT (C) 1983 GLENN EVERHART
  1650. C ALL RIGHTS RESERVED
  1651. C 60=MAX REAL ROWS
  1652. C 301=MAX REAL COLS
  1653. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1654. C VBLS AND TYPE DIMENSIONED 60,301
  1655. C **************************************************
  1656. C *                                                *
  1657.  
  1658. C *      SUBROUTINE  POSTVL (RETCD)                *
  1659. C *                                                *
  1660. C **************************************************
  1661. C
  1662. C
  1663. C  CONVERTS POSTFIX EXPRESSIONS IN STACK 1 TO A VALUE
  1664. C
  1665. C
  1666. C    RETCD    MEANING
  1667. C
  1668. C    1    O.K.
  1669. C    2    ERROR
  1670. C
  1671. C POSTVL CALLS
  1672. C
  1673. C CALBIN    CALCULATES BINARY OPERATIONS
  1674. C CALUN     CALCULATES UNARY OPERATIONS
  1675. C ERRMSG    PRINTS OUT ERROR MESSAGES
  1676. C VAROUT    OUTPUTS THE VALUE OF A VARIABLE
  1677. C
  1678. C
  1679. C
  1680. C
  1681. C POSTVL IS CALLED BY CALC
  1682. C
  1683. C
  1684. C
  1685. C
  1686. C VARIABLE    USE
  1687. C _________ ___________________________
  1688. C
  1689. C    I,K     TEMPORARY VALUES
  1690. C
  1691. C    PT1     POINTS TO TOP ELEMENT IN STACK1
  1692. C
  1693. C    RETCD   RETURN CODE: 1=O.K., 2=ERROR
  1694. C
  1695. C    RETCD2  USED TO HOLD RETURN CODE WHEN CALLS TO
  1696. C            OTHER ROUTINES ARE MADE.
  1697. C
  1698. C    ST1PT   STACK 1 POINTER.
  1699. C
  1700. C    ST2PT   STACK 2 POINTER.
  1701. C
  1702. C    ST1TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 1
  1703. C
  1704. C    ST2TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 2
  1705. C
  1706. C    STACK1  HOLDS ORIGINAL POSTFIX EXPRESSION.
  1707. C
  1708. C    STACK2  USED TO EVALUATE EXPRESSION IN STACK1.
  1709. C
  1710. C    TYPE(27) HOLDS THE DATA TYPE FOR EACH OF THE VARIABLES.
  1711. C
  1712. C    AVBLS(100,27) HOLDS VALUES OF VARIABLES.
  1713. C    VBLS(8,60,301) HOLDS VALUE OF COMPLEXLY-NAMED VARIABLES. 1ST 27 ELEMENTS
  1714. C    ARE PLACE HOLDERS FOR AVBLS; ROUTINES THAT GENERATE DIMENSIONS ID1,ID2
  1715. C    FOR VBLS RETURN DIMENSIONS 1-27,1 FOR A-Z,%. THESE RESULT IN AVBLS
  1716. C    ARRAY BEING USED. VBLS ARRAY (MAX LENGTH 8 BYTES/VARIABLE) IS USED
  1717. C    FOR OTHER VARIABLES WHOSE NAMES ARE <ALPHA><ALPHA><NUM><NUM>
  1718. C    (WITH OPTION FOR ANY REASONABLE # OF ALPHAS AND NUMERICS BUT CLAMPED
  1719. C    AT 60,301 VALUES TO WORK CORRECTLY.)
  1720. C
  1721. C    VIEWSW   VIEW SWITCH:
  1722. C                0 = OFF
  1723. C                1 = DISPLAY COMMANDS
  1724. C                2 = DISPLAY VALUE OF EXPRESSIONS
  1725. C                3 = DISPLAY ALL
  1726. C
  1727. C
  1728. C
  1729. C    SUBROUTINE POSTVL (RETCD)
  1730. C
  1731.     InTeGer*4 LEVEL,NONBLK,LEND
  1732.     InTeGer*4 PT1
  1733.     InTeGer*4 VIEWSW,BASED
  1734.     InTeGer*4 RETCD,RETCD2,VLEN(9)
  1735.     InTeGer*4 TYPE(1,1)
  1736.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  1737.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  1738.     InTeGer*4 I,K
  1739. C
  1740.     CHARACTER*1 LINE(80)
  1741.     CHARACTER*1 STACK1(8,40), STACK2(8,40),AVBLS(20,27)
  1742.     CHARACTER*1 VBLS(8,1,1)
  1743. C
  1744.     COMMON /STACK/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  1745.      ;           ST1LIM,ST2LIM
  1746.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  1747.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1748. C
  1749. C
  1750. C
  1751. C
  1752.     RETCD=1
  1753. C
  1754. C
  1755. C IF THERE IS ONE ELEMENT IN STACK1 AND IT IS NOT
  1756. C A NUMBER, THE EXPRESSION IS ILLEGAL (GO TO 95).
  1757.     IF(ST1PT.EQ.2.AND.ST1TYP(1).GT.30)GO TO 95
  1758. C
  1759. C
  1760. 10    IF (ST1PT.GT.2) GOTO 40
  1761.     IF (ST1PT.EQ.1) GOTO 95
  1762. C
  1763. C
  1764. C ***************************************
  1765. C ****** ONLY 1 ELEMENT ON STACK 1 ******
  1766. C ***************************************
  1767.     K=VLEN(ST1TYP(ST1PT-1))
  1768. C
  1769. C
  1770. C COPY INTO VARIABLE %
  1771.     DO 20 I=1,K
  1772. 20    AVBLS(I,27)=STACK1(I,1)
  1773.     CALL TYPSET(27,1,ST1TYP(1))
  1774. C    TYPE(27,1)=ST1TYP(1)
  1775. C
  1776. C
  1777. C OUTPUT VALUE OF %
  1778.     IF (VIEWSW.GT.1) CALL VAROUT(27,1)
  1779.     RETURN
  1780. C
  1781. C
  1782. C  MORE THAN ONE ELEMENT ON STACK1
  1783. 40    CONTINUE
  1784.     IF (ST1TYP(ST1PT-1).LE.30) GOTO 90
  1785.     IF (ST2PT.LE.ST2LIM) GOTO 45
  1786. C
  1787. C
  1788. C *** ERROR *** STACK 2 OVERFLOW
  1789.     CALL ERRMSG(9)
  1790. 43    RETCD=2
  1791.     RETURN
  1792. C
  1793. C
  1794. C
  1795. C
  1796. C ****************************************
  1797. C ****** OPERATOR SO PUT ON STACK 2 ******
  1798. C ****************************************
  1799. 45    ST2TYP(ST2PT)=ST1TYP(ST1PT-1)
  1800.     ST2PT=ST2PT+1
  1801.     ST1PT=ST1PT-1
  1802.     IF(ST1PT.EQ.1)GO TO 95
  1803.     GOTO 40
  1804. C
  1805. C
  1806. C
  1807. C
  1808. C
  1809. C *********************
  1810. C ****** OPERAND ******
  1811. C *********************
  1812. C
  1813. C FIRST BE SURE THAT THERE IS AN OPERATOR INVOLVED ON STACK 2
  1814. C (IF ONLY ONE ELEMENT IN STACK 1 YOU SHOULD NOT BE HERE).
  1815. 90    IF(ST2PT.NE.1)GO TO 110
  1816. C
  1817. C
  1818. C *** ERROR *** ILLLEGAL EXPRESSION
  1819. 95    CALL ERRMSG(8)
  1820.     GO TO 43
  1821. C
  1822. C
  1823. C
  1824. C
  1825. C ENTER HERE AFTER APPLYING AN OPERATOR TO A NUMBER
  1826. 100    IF (ST2PT.EQ.1) GOTO 10
  1827. 110    K=ST2TYP(ST2PT-1)
  1828. C
  1829. C IF A UNARY OPERATOR, GO TO 190
  1830.     IF ((K.GT.30.AND.K.LE.47).OR.K.EQ.111) GOTO 190
  1831. C
  1832. C
  1833. C IF A BINARY OPERATOR, GO TO 170
  1834.     IF (K.GE.110.AND.K.LE.117) GOTO 170
  1835.     IF(K.EQ.200)GO TO 170
  1836. C
  1837. C IF ELEMENT ON STACK2 AT ST2PT-1 IS AN OPERAND, APPLY CALBIN AGAIN
  1838.     IF(K.LE.30) GO TO 180
  1839.     STOP 110
  1840. C
  1841. C
  1842. C
  1843. C
  1844. C ***************************************************************
  1845. C ****** CALBIN CALCULATES THE BINARY VALUE OF AN OPERATOR ******
  1846. C ***************************************************************
  1847. C  UPON ENTRANCE:
  1848. C    OPERAND 1 IS IN STACK 1
  1849. C    OPERAND 2 IS IN STACK 2
  1850. C    OPERATOR IS BELOW OPERAND 2
  1851. C  UPON EXIT RESULT IS ON STACK 1
  1852. C
  1853. C    RETURN CODE    MEANING
  1854. C
  1855. C    1        O.K.
  1856. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  1857. C    3        ERROR ENCOUNTERED
  1858. C
  1859. C
  1860. 170    CONTINUE
  1861. C
  1862. C
  1863. C FIRST PUT OPERAND 2 ONTO STACK 2
  1864.     PT1=ST1PT-1
  1865.     ST2TYP(ST2PT)=ST1TYP(PT1)
  1866.     K=VLEN(ST2TYP(ST2PT))
  1867.     DO 175 I=1,K
  1868. 175    STACK2(I,ST2PT)=STACK1(I,PT1)
  1869.     ST1PT=ST1PT-1
  1870.     IF(ST1PT.EQ.1)GO TO 95
  1871.     ST2PT=ST2PT+1
  1872. C
  1873. C
  1874. C IF OPERAND 1 IS AN OPERATOR, PUT IT ON STACK 2 (GO TO 45)
  1875.     IF(ST1TYP(ST1PT-1).GT.30) GO TO 45
  1876. 180    CALL CALBIN (RETCD2)
  1877.     GOTO (100,1000,43), RETCD2
  1878.     STOP 180
  1879. C
  1880. C
  1881. C
  1882. C
  1883. C
  1884. C ********************************************************************
  1885. C ****** CALL CALUN TO CALCULATE THE VALUE OF A UNARY OPERATION ******
  1886. C ********************************************************************
  1887. C    OPERATOR IS IN STACK 2
  1888. C    OPERAND IS IN STACK 1
  1889. C    UPON EXIT, OPERATOR IS POPPED OFF STACK 2
  1890. C
  1891. C    RETURN CODE    MEANING
  1892. C
  1893. C    1        O.K.
  1894. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  1895. C    3        ERROR ENCOUNTERED
  1896. C
  1897. C
  1898. 190    CALL CALUN (RETCD2)
  1899.     GOTO(100,43),RETCD2
  1900.     STOP 190
  1901. C
  1902. C
  1903. 1000    RETURN
  1904.     END
  1905. c -h- prtcon.for    Tue Sep  2 10:58:55 1986    
  1906. C **********************************
  1907. C *                                *
  1908. C *    INTERNAL FUNCTION PRTCON    *
  1909. C *                                *
  1910. C **********************************
  1911. C CALLED BY MOUT ONLY
  1912. C CONVERTS 0 TO APPROPRIATE NUMBER FOR PRINTING WITH VECTOR DIGITS
  1913.     FUNCTION PRTCON(L1,IBASE)
  1914.     InTeGer*4 BASE(3)
  1915.     InTeGer*4 IBASE,K
  1916.     CHARACTER*1 L1,PRTCON,DIGITS(16,3)
  1917.     COMMON /DIGV/ DIGITS
  1918.     DATA BASE /10,8,16/
  1919.     PRTCON=L1
  1920.     IF(L1.EQ.0)PRTCON=CHAR(BASE(IBASE))
  1921.     K=ICHAR(PRTCON)
  1922.     PRTCON=DIGITS(K,IBASE)
  1923.     RETURN
  1924.     END
  1925. c -h- rassig.for    Tue Sep  2 10:58:55 1986    
  1926.     SUBROUTINE RASSIG(IUNIT,NAME)
  1927. C
  1928. C
  1929.     CHARACTER*1 NAME(50)
  1930.     InTeGer*4 IUNIT
  1931. C &&&& MS FTN 3.2
  1932.     LOGICAL LEXIST
  1933. C &&&&
  1934.     CHARACTER*20 WK
  1935.     CHARACTER*1 WK1(20)
  1936.     EQUIVALENCE(WK(1:1),WK1(1))
  1937. C JUST TRY AND NULL FILL A NAME TO USE.
  1938.     DO 1 N=1,20
  1939.     WK1(N)=' '
  1940. 1    CONTINUE
  1941.     DO 2 N=1,20
  1942.     II=ICHAR(NAME(N))
  1943.     IF(II.LT.32)GOTO 3
  1944.     WK1(N)=CHAR(II)
  1945. C1    CONTINUE
  1946. 2    CONTINUE
  1947. 3    CONTINUE
  1948. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  1949. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  1950. C AVOID CRASHES IF THE FILE ISN'T THERE...
  1951. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  1952. C &&&&
  1953. C
  1954. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  1955. C
  1956.     INQUIRE(FILE=WK(1:20),EXIST=LEXIST)
  1957.     IF(LEXIST)GOTO 100
  1958. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  1959. C IF CREATE FAILS WE LOSE TOO...
  1960. c    CALL UVT100(1,1,1)
  1961. c    CALL SWRT('File not found. Attempting to create.',37)
  1962. c    OPEN(IUNIT,FILE=WK,STATUS='NEW',ACCESS='SEQUENTIAL',
  1963. c     1  FORM='FORMATTED')
  1964. c    CLOSE(IUNIT)
  1965. c
  1966. c On failure to open a file, create a window instead which
  1967. c can be its surrogate...
  1968. c
  1969.     Open(Iunit,file='CON:200/100/400/60/RdErr ' // wk,
  1970.      1  Access='Sequential',form='Formatted')
  1971. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  1972. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  1973.     Goto 77
  1974. 100    CONTINUE
  1975. C &&&&
  1976. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  1977.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  1978.      1  FORM='FORMATTED')
  1979. 77    CONTINUE
  1980. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  1981. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  1982.     RETURN
  1983.     END
  1984. c -h- recalc.f40    Tue Sep  2 10:58:55 1986    
  1985.     SUBROUTINE RECALC
  1986. C COPYRIGHT (C) 1983,1984,1985,1986 GLENN EVERHART
  1987. C ALL RIGHTS RESERVED
  1988. C RECALCULATE COMMAND
  1989. C RECOMPUTE ALL ELEMENTS OF SPREADSHEET WHERE VALID.
  1990. C PARAMETER 18060=60*301
  1991. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1992. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1993. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1994. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1995. C FROM THE DISK BASED FILE HERE.
  1996.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  1997.     INTEGER*4 VNLT
  1998. C ***<<< XVXTCD COMMON START >>>***
  1999.     CHARACTER*1 OARRY(100)
  2000.     InTeGer*4 OSWIT,OCNTR
  2001. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  2002. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  2003.     InTeGer*4 IPS1,IPS2,MODFLG
  2004. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  2005.        InTeGer*4 XTCFG,IPSET,XTNCNT
  2006.        CHARACTER*1 XTNCMD(80)
  2007. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2008. C VARY FLAG ITERATION COUNT
  2009.     INTEGER KALKIT
  2010. C    COMMON/VARYIT/KALKIT
  2011.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2012.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2013. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2014. C     1  IRCE2
  2015. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2016. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2017. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2018. C RCFGX ON.
  2019. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2020. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2021. C  AND VM INHIBITS. (SETS TO 1).
  2022.     INTEGER*4 FH
  2023. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2024. C    COMMON/CONSFH/FH
  2025.     CHARACTER*1 ARGSTR(52,4)
  2026. C    COMMON/ARGSTR/ARGSTR
  2027.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2028.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2029.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2030.      3  IRCE2,FH,ARGSTR
  2031. C ***<<< XVXTCD COMMON END >>>***
  2032. CCCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  2033. CCCC     1  IRCE1,IRCE2
  2034. CCCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  2035. CCCC     1  IRCE1,IRCE2
  2036. C ***<<< KLSTO COMMON START >>>***
  2037.     InTeGer*4 DLFG
  2038. C    COMMON/DLFG/DLFG
  2039.     InTeGer*4 KDRW,KDCL
  2040. C    COMMON/DOT/KDRW,KDCL
  2041.     InTeGer*4 DTRENA
  2042. C    COMMON/DTRCMN/DTRENA
  2043.     REAL*8 EP,PV,FV
  2044.     DIMENSION EP(20)
  2045.     INTEGER*4 KIRR
  2046. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2047.     InTeGer*4 LASTOP
  2048. C    COMMON/ERROR/LASTOP
  2049.     CHARACTER*1 FMTDAT(9,76)
  2050. C    COMMON/FMTBFR/FMTDAT
  2051.     CHARACTER*1 EDNAM(16)
  2052. C    COMMON/EDNAM/EDNAM
  2053.     InTeGer*4 MFID(2),MFMOD(2)
  2054. C    COMMON/FRM/MFID,MFMOD
  2055.     InTeGer*4 JMVFG,JMVOLD
  2056. C    COMMON/FUBAR/JMVFG,JMVOLD
  2057.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2058.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2059. C ***<<< KLSTO COMMON END >>>***
  2060. CCC    InTeGer*4 DLFG
  2061. CCC    COMMON/DLFG/DLFG
  2062. C DLFG=1 IF D## FORMS HAVE BEEN SEEN, ELSE 0
  2063.     DIMENSION FORM(128),FVLD(1,1)
  2064.     COMMON/FVLDC/FVLD
  2065. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  2066. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  2067. C SO INITIALLY IGNORE.
  2068. C FVLD=-2 OR -3 = DISPLAY FORMULA
  2069. C FVLD=3 NUMERIC, COMPUTE ONCE THEN SET FVLD TO 2
  2070. C FVLD=2 NUMERIC CONSTANT, ALREADY COMPUTED... DO NOT RECOMPUTE.
  2071. C
  2072. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  2073. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  2074. C ***<<<< RDD COMMON START >>>***
  2075.     InTeGer*4 RRWACT,RCLACT
  2076. C    COMMON/RCLACT/RRWACT,RCLACT
  2077.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2078.      1  IDOL7,IDOL8
  2079. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2080. C     1  IDOL7,IDOL8
  2081.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2082. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2083.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2084. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2085. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2086. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2087.     InTeGer*4 KLVL
  2088. C    COMMON/KLVL/KLVL
  2089.     InTeGer*4 IOLVL,IGOLD
  2090. C    COMMON/IOLVL/IOLVL
  2091. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2092. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2093.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2094.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2095.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2096. C ***<<< RDD COMMON END >>>***
  2097. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2098. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2099.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  2100.     COMMON/D2R/NRDSP,NCDSP
  2101.     InTeGer*4 TYPE(1,1),VLEN(9)
  2102.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  2103. CCC    InTeGer*4 RRWACT,RCLACT
  2104. CCC    COMMON/RCLACT/RRWACT,RCLACT
  2105. CCC    InTeGer*4 KDRW,KDCL
  2106. CCC    COMMON /DOT/KDRW,KDCL
  2107.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  2108.     InTeGer*4 PRS,PCS,DRS,DCS
  2109.     PRS=PROW
  2110.     PCS=PCOL
  2111.     DRS=DROW
  2112.     DCS=DCOL
  2113.     IF(RCMODE.EQ.2)GOTO 5500
  2114. C THE FOLLOWING 2 LOOPS DEFINE ORDER OF CALCULATION.
  2115. C HERE THIS IS: OUTER LOOP ON ROWS (ACROSS), INNER LOOP ON COLUMNS (DOWN).
  2116. C NOTE THAT N2 DEFINES THE SHEET. SINCE 1 IS THE ACCUMULATORS, JUST GO THRU
  2117. C FOR THE SHEET, NOT THE AC'S.
  2118.     DO 1 N2=2,RCLACT
  2119.     N1=1
  2120. 220    CONTINUE
  2121. C    DO 2 N1=1,60
  2122. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  2123. C FASTER THAN STANDARD LOOP METHOD.
  2124. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  2125. C OF FVLDGT AND FVPEEK.
  2126. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  2127. CCCC COMMENT 2 LINES OUT WHEN FAST FVLDGT IS IN TO SPEED UP MORE...
  2128. CCCC EXTRA LOGIC IN FVPEEK DOESN'T USUALLY PAY FOR ITSELF...
  2129. CCC    CALL FVPEEK(N1,N2,NN1)
  2130. CCC    N1=NN1
  2131.     CALL FVLDGT(N1,N2,FVLD(1,1))
  2132.     IIFV=JCHAR(FVLD(1,1))
  2133.     IF (IIFV.LE.0) GOTO 2
  2134.     IRRX=(N2-1)*60+N1
  2135. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  2136. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  2137.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 2
  2138.     KDRW=N1
  2139.     KDCL=N2
  2140.     PROW=N1
  2141.     PCOL=N2
  2142. C SEE IF THIS PHYS COL HAS A DISPLAY COL. AND IF SO SET THAT UP.
  2143. C ONLY SET TO DISPLAYED LOCS HERE TO MINIMIZE SEARCH TIME.
  2144. C NEED THIS TO HANDLE D## FORMS...
  2145.     IF (DLFG.EQ.0)GOTO 95
  2146. C IF NEVER HAD A D## FORM FORGET LOOKING FOR DISPLAY LOCS.
  2147.     DO 20 M2=1,DCLV
  2148.     DO 10 M1=1,DRWV
  2149.     M1X=M1
  2150.     M2X=M2
  2151. C LOOK FOR DISPLAY COORDS EVEN IF IN HYPERSPACE
  2152. C WE FIND ONE IF INDEX FROM REFLECT IS SAME AS WHAT
  2153. C WE'RE LOOKING FOR...
  2154.     IF(NRDSP(M1,M2).EQ.N1.AND.NCDSP(M1,M2).EQ.N2)GOTO 9
  2155. 10    CONTINUE
  2156. 20    CONTINUE
  2157. 95    CONTINUE
  2158. C HERE IF CELL NOT DISPLAYED... SEE IF NEEDS DOING IN RI, RE MODES
  2159.     IF(RCMODE.LE.0)GOTO 9
  2160.     IF(PROW.NE.IRCE1.OR.PCOL.NE.IRCE2)GOTO 2
  2161. C SKIP UNLESS ENTER CELL.
  2162. 9    CONTINUE
  2163. C IF NO DISPLAY ROW, LEAVE AT LOW RIGHT...
  2164. C USE SAVED VALUES SO WE DON'T RELY ON DO LOOP INDEX AFTER LOOP END.
  2165.     DROW=M1X
  2166.     DCOL=M2X
  2167.     CALL WRKFIL(IRRX,FORM,0)
  2168. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  2169.     LFST=1
  2170. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  2171. C THEM UP A BIT.
  2172.     DO 56 N=1,109
  2173.     LLST=111-N
  2174.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 57
  2175.     FORM(LLST)=Char(0)
  2176. 56    CONTINUE
  2177. 57    CONTINUE
  2178.     FORM(LLST)=Char(0)
  2179.     FORM(111)=Char(0)
  2180. C    IF(ICHAR(FORM(118)).NE.15)GOTO 2
  2181.     CALL DOENTR(FORM,LFST,LLST)
  2182. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  2183. C    CALL FVLDGT(N1,N2,FVLD(1,1))
  2184.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  2185. 2    CONTINUE
  2186.     N1=N1+1
  2187.     IF(N1.LE.RRWACT)GOTO 220
  2188. 1    CONTINUE
  2189.     GOTO 5600
  2190. 5500    CONTINUE
  2191. C RCMODE=2 AND NOT RM MODE
  2192. C (IN RM MODE, RECALC IS NOT CALLED...)
  2193.     DO 1701 M2=1,DCLV
  2194.     DO 1702 M1=1,DRWV
  2195. C TO HANDLE DISPLAY WHEREVER IT MAY BE, FIND ID OF PHYS CELL AND
  2196. C CONVERT TO PHYS ROW, COL AGAIN REGARDLESS OF ALIAS...
  2197. C (NOTE CALC ORDER IS THEREFORE DISPLAY ORDER, NOT SHEET ORDER...)
  2198.     K=NRDSP(M1,M2)
  2199.     KK=NCDSP(M1,M2)
  2200.     CALL REFLECT(KK,K,IV1)
  2201.     NRC=IV1-1
  2202.     N1=MOD(NRC,60)+1
  2203.     N2=((NRC-N1+1)/60)+1
  2204. C COMPUTE PHYS ROW, COL FROM DISPLAY COORDINATES.
  2205. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  2206. C FASTER THAN STANDARD LOOP METHOD.
  2207. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  2208. C OF FVLDGT AND FVPEEK.
  2209. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  2210.     CALL FVLDGT(N1,N2,FVLD(1,1))
  2211.     IIFV=JCHAR(FVLD(1,1))
  2212.     IF (IIFV.LE.0) GOTO 1702
  2213. C FORGET THIS CELL IF NOT A COMPUTABLE ONE...
  2214.     IRRX=IV1
  2215. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  2216. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  2217.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 1702
  2218.     KDRW=N1
  2219.     KDCL=N2
  2220.     PROW=N1
  2221.     PCOL=N2
  2222.     DROW=M1
  2223.     DCOL=M2
  2224.     CALL WRKFIL(IRRX,FORM,0)
  2225. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  2226.     LFST=1
  2227. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  2228. C THEM UP A BIT.
  2229. C (ALSO GUARANTEE WE HAVE LOTS OF NULLS AT END TO TERMINATE INDEX ROUTINES)
  2230.     DO 756 N=1,109
  2231.     LLST=111-N
  2232.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 757
  2233.     FORM(LLST)=Char(0)
  2234. 756    CONTINUE
  2235. 757    CONTINUE
  2236.     FORM(LLST)=Char(0)
  2237.     FORM(111)=Char(0)
  2238. C CALL DOENTR TO DO THE ACTUAL COMPUTATION WORK...
  2239.     CALL DOENTR(FORM,LFST,LLST)
  2240. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  2241.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  2242. 1702    CONTINUE
  2243. 1701    CONTINUE
  2244. C END OF COMPUTATION OVER DISPLAYS
  2245. C    GOTO 5600
  2246. 5600    CONTINUE
  2247.     PROW=PRS
  2248.     PCOL=PCS
  2249.     DROW=DRS
  2250.     DCOL=DCOL
  2251. C FORCE FUNCTION WORKS ONCE ONLY.
  2252.     RCONE=0
  2253.     RCMODE=IABS(RCMODE)
  2254. C SET FOR TEMP. RECALC-ALL MODES TO RETURN TO NORMAL.
  2255.     IRCE1=0
  2256.     IRCE2=0
  2257.     RETURN
  2258.     END
  2259. c -h- reflect.f40    Tue Sep  2 10:58:55 1986    
  2260.     SUBROUTINE REFLEC(ID1,ID2,ID)
  2261. C FORM ID OUT OF ID1,ID2 BUT USING REFLECTED VALUES SO THAT
  2262. C RESULT ID IS ALWAYS IN PRIME AREA.
  2263.     InTeGer*4 ID,ID1,ID2,IDD1,IDD2
  2264. C ***<<< NULETC COMMON START >>>***
  2265.     InTeGer*4 ICREF,IRREF
  2266. C    COMMON/MIRROR/ICREF,IRREF
  2267.     InTeGer*4 MODPUB,LIMODE
  2268. C    COMMON/MODPUB/MODPUB,LIMODE
  2269.     InTeGer*4 KLKC,KLKR
  2270.     REAL*8 AACP,AACQ
  2271. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2272.     InTeGer*4 NCEL,NXINI
  2273. C    COMMON/NCEL/NCEL,NXINI
  2274.     CHARACTER*1 NAMARY(20,301)
  2275. C    COMMON/NMNMNM/NAMARY
  2276.     InTeGer*4 NULAST,LFVD
  2277. C    COMMON/NULXXX/NULAST,LFVD
  2278.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2279.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2280. C ***<<< NULETC COMMON END >>>***
  2281. CCC    COMMON/MIRROR/ICREF,IRREF
  2282. C IN RECALC WE MOVE OVER PRIME AREA ONLY AND SEARCH FOR CELLS IN
  2283. C DISPLAY AREA THERE. THIS IMPLIES THAT WE DON'T FIND DISPLAY
  2284. C COORDS OF CELLS IN EXTENDED AREAS THERE.  THEREFORE THE RI AND RE
  2285. C MODES FAIL COMPLETELY THERE. SINCE WE WANT THE SYSTEM TO WORK IN
  2286. C A PREDICTABLE WAY, FORCE RECALC MODE (I.E., R OR RM MODES) THERE TO
  2287. C ALLOW CELLS TO BE COMPUTED.
  2288. C NOTE THAT IF WE ARE IN THE PRIME AREA AND ISSUE AN RE OR RI COMMAND,
  2289. C THAT MODE SHOULD STAY SET SO LONG AS WE STAY THERE SINCE THE RE OR
  2290. C RI MODES WILL INHIBIT COMPUTING OUTSIDE THAT AREA (AS LONG AS NOTHING
  2291. C REFLECTS INTO IT) SO THERE WILL BE NO REASON FOR THIS TO BE CALLED
  2292. C TO REFLECT SOMETHING BACK TO PRIME AREA UNTIL A R COMMAND IS GIVEN
  2293. C OR THE DISPLAY MOVES OFF THE EDGE OF THE PRIME 60 BY 301 AREA.
  2294. C
  2295. C ***<<< XVXTCD COMMON START >>>***
  2296.     CHARACTER*1 OARRY(100)
  2297.     InTeGer*4 OSWIT,OCNTR
  2298. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  2299. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  2300.     InTeGer*4 IPS1,IPS2,MODFLG
  2301. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  2302.        InTeGer*4 XTCFG,IPSET,XTNCNT
  2303.        CHARACTER*1 XTNCMD(80)
  2304. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2305. C VARY FLAG ITERATION COUNT
  2306.     INTEGER KALKIT
  2307. C    COMMON/VARYIT/KALKIT
  2308.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2309.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2310. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2311. C     1  IRCE2
  2312. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2313. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2314. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2315. C RCFGX ON.
  2316. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2317. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2318. C  AND VM INHIBITS. (SETS TO 1).
  2319.     INTEGER*4 FH
  2320. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2321. C    COMMON/CONSFH/FH
  2322.     CHARACTER*1 ARGSTR(52,4)
  2323. C    COMMON/ARGSTR/ARGSTR
  2324.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2325.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2326.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2327.      3  IRCE2,FH,ARGSTR
  2328. C ***<<< XVXTCD COMMON END >>>***
  2329. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE
  2330. CCC    InTeGer*4 IRCE1,IRCE2
  2331. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,IRCE2
  2332.     IDD1=MAX0(ID1,1)
  2333.     IDD2=ID2
  2334. C ACCEPT TRICK CALLS WITH ID1=0 AS FROM GMSUBS, MTXEQU,
  2335. C AND MDST
  2336.     IF(ID1.LT.1)GOTO 2000
  2337. 4000    CONTINUE
  2338.     IF(IDD2.LE.60)GOTO 1000
  2339.     IDD2=IDD2-60
  2340.     IDD1=IDD1+IRREF
  2341. c    RCMODE=0
  2342. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  2343.     GOTO 4000
  2344. 1000    CONTINUE
  2345.     IF(IDD1.LE.301)GOTO 2000
  2346.     IDD1=IDD1-300
  2347.     IDD2=IDD2+ICREF
  2348. c    RCMODE=0
  2349. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  2350.     GOTO 4000
  2351. 2000    CONTINUE
  2352.     ID=(IDD1-1)*60+IDD2
  2353.     RETURN
  2354.     END
  2355. c -h- relvbl.for    Tue Sep  2 10:58:55 1986    
  2356.     SUBROUTINE RELVBL(LNIN,LNOUT,INRW,INCL,JOUTR,JOUTC,JRTR,JRTC)
  2357. C RELOCATE VARIABLES BELOW/RIGHT OF JRTR,JRTC INTO LNOUT FROM LNIN
  2358. C    PARAMETER CUP=1,ED=11,EL=12
  2359.     CHARACTER*1 NAME(4),NUMBER(6)
  2360.     CHARACTER*1 LNIN,LNOUT
  2361.     CHARACTER*6 NUMBR6
  2362.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  2363.     DIMENSION LNIN(128),LNOUT(128)
  2364. C ***<<<< RDD COMMON START >>>***
  2365.     InTeGer*4 RRWACT,RCLACT
  2366. C    COMMON/RCLACT/RRWACT,RCLACT
  2367.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2368.      1  IDOL7,IDOL8
  2369. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2370. C     1  IDOL7,IDOL8
  2371.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2372. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2373.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2374. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2375. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2376. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2377.     InTeGer*4 KLVL
  2378. C    COMMON/KLVL/KLVL
  2379.     InTeGer*4 IOLVL,IGOLD
  2380. C    COMMON/IOLVL/IOLVL
  2381. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2382. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2383.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2384.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2385.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2386. C ***<<< RDD COMMON END >>>***
  2387. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2388. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2389. C    LOGICAL*2 L63,L192,L255,L127,L128
  2390.     LOGICAL*4 L1,L2
  2391. C    InTeGer*4 I63,I192,I255,I127,I128
  2392.     InTeGer*4 I63,I192,I127
  2393.     InTeGer*4 I1,I2
  2394. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  2395.     EQUIVALENCE (I1,L1),(I2,L2)
  2396. C    EQUIVALENCE (L127,I127),(L128,I128)
  2397. C    DATA I63/63/,I192/192/,I255/255/,I127/127/,I128/128/
  2398.     DATA I63/63/,I192/192/,I127/127/
  2399.     LI=1
  2400.     LO=1
  2401. C LI = INPUT LOCATION
  2402. C LO=OUTPUT LOCATION
  2403. 100    CONTINUE
  2404. C    IF(LNIN(LI).LT.'A'.OR.LNIN(LI).GT.'Z')GOTO 200
  2405.     LCC=ICHAR(LNIN(LI))
  2406. C IF WE HAVE 255,CODE,CODE THEN RELOCATE IN BINARY...
  2407.     IF(LCC.EQ.255)GOTO 500
  2408.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  2409. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  2410.     IL1=LI
  2411.     LE=110
  2412.     LSTC=LE
  2413.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  2414. C AVOID MESSING UP FUNCTION NAMES
  2415.     IF(ID2.EQ.1)IVLD=0
  2416. C    IF(ID2.EQ.1.AND.ID1.LE.27)IVLD=0
  2417.     IF(IVLD.EQ.0)GOTO 200
  2418. C FOUND VARIABLE. NOW GENERATE ASCII ANDSTUFF INTO OUTPUT.
  2419. C FIRST DON'T RELOCATE P## AND D## FORMS.
  2420.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  2421. C RELOCATE NORMAL VARIABLE HERE.
  2422. C
  2423. C THE NEW VARIABLE IS TO BE DIFFERENT ONLY IF (ID1,ID2) HAS
  2424. C ID1.GT.JRTR AND ID2.GT.JRTC
  2425.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 210
  2426.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 210
  2427. C OK, KNOW NOW THAT WE HAVE TO RELOCATE ALL.
  2428. C THEREFORE ADD THE DIFFERENCE BETWEEN DEST AND SRC TO BOTH
  2429. C AND CLAMP TO VALID DIMENSIONS.
  2430.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  2431.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  2432. 906    ID1=MAX0(ID1,1)
  2433.     ID2=MAX0(ID2,1)
  2434. C CAN UNPACK THIS STUFF ALL RIGHT IN EXTENDED WAYS.
  2435.     ID1=MIN0(18060,ID1)
  2436.     ID2=MIN0(18060,ID2)
  2437.  
  2438. 210    CONTINUE
  2439.     CALL IN2AS(ID1,NAME)
  2440. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  2441.     IL2=ID2-1
  2442.     WRITE(NUMBR6(1:6),1000)IL2
  2443. C    ENCODE(6,1000,NUMBER)IL2
  2444. 1000    FORMAT(I6)
  2445. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  2446. C THROW OUT SPACES AND COPY THE REST.
  2447.     LI=LSTC
  2448.     DO 202 N=1,4
  2449.     IF(Ichar(NAME(N)).LE.32)GOTO 202
  2450.     LNOUT(LO)=NAME(N)
  2451.     LO=LO+1
  2452.     IF(LO.GT.110)GOTO 300
  2453. 202    CONTINUE
  2454.     IF(IDOL1.GT.0)LNOUT(LO)=36
  2455.     IF(IDOL1.GT.0.AND.LO.LE.109)LO=LO+1
  2456.     DO 203 N=1,6
  2457.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  2458. C IF 32 ISN'T SPACE, LOSE
  2459.     LNOUT(LO)=NUMBER(N)
  2460.     LO=LO+1
  2461.     IF(LO.GT.110)GOTO 300
  2462. 203    CONTINUE
  2463.     IF(IDOL2.EQ.0)GOTO 300
  2464.     LNOUT(LO)=CHAR(36)
  2465.     IF(LO.LE.109)LO=LO+1
  2466.     GOTO 300
  2467. 250    CONTINUE
  2468. C JUST COPY DISPLAY FORMS.
  2469.     IL1=LSTC-1
  2470.     DO 251 N=LI,IL1
  2471.     LNOUT(LO)=LNIN(N)
  2472.     LO=LO+1
  2473.     IF(LO.GT.110)GOTO 300
  2474. 251    CONTINUE
  2475.     LI=LSTC
  2476. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  2477.     GOTO 300
  2478. 200    LNOUT(LO)=LNIN(LI)
  2479.     LO=LO+1
  2480.     LI=LI+1
  2481. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  2482. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  2483.     LO=MIN0(LO,110)
  2484.     DO 400 N=LO,110
  2485. 400    LNOUT(N)=0
  2486.     DO 1 N=111,128
  2487. 1    LNOUT(N)=LNIN(N)
  2488. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  2489.     RETURN
  2490. 500    CONTINUE
  2491. C DECODE BY HAND...
  2492.     LNOUT(LO)=LNIN(LI)
  2493.     I1=ICHAR(LNIN(LI+1))
  2494.     I2=IMASK(I1,I192)
  2495. C    L2=L1.AND.L192
  2496.     I1=IMASK(I1,I63)
  2497. C    L1=L1.AND.L63
  2498. C DO MASKING TO GET BINARY COORDS
  2499.     ID1=I1
  2500.     I1=ICHAR(LNIN(LI+2))
  2501.     I1=IMASK(I1,I127)
  2502. C    L1=L1.AND.L127
  2503.     ID2=I2*2+I1
  2504. C NOW RELOCATE AND PUT BACK
  2505.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 510
  2506.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 510
  2507.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  2508.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  2509. C CLAMP RESULT TO MAX RANGES
  2510.     ID1=MAX0(ID1,1)
  2511.     ID2=MAX0(ID2,1)
  2512. C DO GENERAL REPACK IF ID1 OR ID2 ARE EXTENDED RANGE.
  2513.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 905
  2514. C    ID1=MIN0(60,ID1)
  2515. C    ID2=MIN0(301,ID2)
  2516. 510    CONTINUE
  2517. C RELOCATED, NOW REPACK AS NEW BINARY PATTERNS
  2518.     I1=ID1
  2519. C    L1=L1.AND.L63
  2520.     I1=IMASK(I1,I63)
  2521.     I2=ID2/2
  2522.     I2=IMASK(I2,I192)
  2523. C    L2=L2.AND.L192
  2524. C    L1=L1.OR.L2
  2525.     I1=I1+I2
  2526.     LNOUT(LO+1)=CHAR(I1)
  2527.     I2=ID2
  2528.     I2=IMASK(I2,I127)+128
  2529. C    L2=L2.AND.L127
  2530. C    L2=L2.OR.L128
  2531. C BE SURE AT LEAST 1 BIT IS SET
  2532.     LNOUT(LO+2)=CHAR(I2)
  2533.     LI=MIN0(109,LI+3)
  2534.     LO=MIN0(109,LO+3)    
  2535. C GO LOOK FOR MORE TO DECODE
  2536.     GOTO 300
  2537. 905    CONTINUE
  2538. C HERE SET UP FOR REENTRY INTO "NORMAL" DECODE
  2539.     LSTC=MIN0(109,LI+3)
  2540.     GOTO 906
  2541.     END
  2542. c -h- rnd.for    Tue Sep  2 10:58:55 1986    
  2543.     FUNCTION RND(DUM)
  2544. C GENERATE RANDOM NUMBER BY LINEAR CONGRUENCE IN BIG
  2545. C INTEGERS.
  2546.     REAL*4 R
  2547.     INTEGER*4 DUM
  2548.     INTEGER*4 I,II
  2549.     LOGICAL*4 L,LMSK
  2550.     REAL*8 XX
  2551.     EQUIVALENCE(I,L),(II,LMSK)
  2552.     I=DUM
  2553.     XX=I
  2554.     XX=XX*214013.0D0+2531011.0D0
  2555.     IF(XX.LT.0.)XX=1.0D0-XX
  2556.     XX=DMOD(XX,16777216.0D0)
  2557.     I=IDINT(XX)
  2558. C    I=I*214013+2531011
  2559. C USE MASKING TO ZOT THIS INTO NORMAL RANGE
  2560. C JUST USE MODULO...
  2561.     IF(I.LT.0)I=1-I
  2562.     IF(I.LT.0)I=0
  2563.     I=MOD(I,16777215)
  2564.     DUM=I
  2565. C RETURN RANDOM BETWEEN 0 AND 1.0
  2566. C PERIOD OF 2**24 MAX
  2567.     XX=I
  2568.     XX=XX/16777216.0
  2569.     R=SNGL(XX)
  2570.     RND=R
  2571.     RETURN
  2572.     END
  2573. c -h- rvboo.for    Tue Sep  2 10:58:55 1986    
  2574.     SUBROUTINE RVBOO(RETV,ID1,ID2)
  2575. C THIS ROUTINE ONLY COPIES ID1,ID2 INTO RETV ARRAY TO AVOID SOME
  2576. C BYTE-INTEGER CONVERSION PROBLEMS. THIS PACKING IS USED TO
  2577. C ACCESS VARIABLE LOCATION LATER.
  2578.     InTeGer*4 RETV,ID1,ID2
  2579.     DIMENSION RETV(2)
  2580.     RETV(1)=ID1
  2581.     RETV(2)=ID2
  2582.     RETURN
  2583.     END
  2584. c -h- scmp.for    Tue Sep  2 10:58:55 1986    
  2585.     SUBROUTINE SCMP(LINA,LINB,LENM,ICODE)
  2586.     DIMENSION LINA(1),LINB(1)
  2587.     CHARACTER*1 LINA,LINB
  2588.     ICODE=1
  2589.     DO 1 N=1,LENM
  2590.     IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  2591. C ALLOW _ TO BE A WILDCARD.
  2592.     IF(LINA(N).EQ.'_'.OR.LINB(N).EQ.'_')GOTO 1
  2593.     IF(LINA(N).NE.LINB(N))ICODE=0
  2594.     IF(ICODE.NE.1)GOTO 2
  2595. 1    CONTINUE
  2596. 2    CONTINUE
  2597.     RETURN
  2598.     END
  2599. c -h- sed.for    Tue Sep  2 10:58:55 1986    
  2600.     SUBROUTINE SED(LCMD,LIN,LWRK,ARGSTR,XAC,LENGTH)
  2601.     CHARACTER*1 LIN(1),LWRK(1),ARGSTR(52,4)
  2602.     CHARACTER*1 LCMD(1),LSU(10)
  2603.     EXTERNAL INDX
  2604.     CHARACTER*10 LSU10
  2605.     EQUIVALENCE (LSU10(1:10),LSU(1))
  2606.     INTEGER*4 III
  2607.     REAL*8 XAC
  2608. C
  2609. C OPERATION:
  2610. C EDIT LIN TO LWRK, WITH LENGTH VARIABLE HOLDING INPUT
  2611. C LENGTH IN CHARACTERS. LCMD HOLDS COMMAND LINE, WHICH
  2612. C ULTIMATELY GETS EDITED STRING COPIED BACK INTO IT.
  2613. C
  2614. C EDITS:
  2615. C  CHARACTER AT IDELIM IS DELIMITER. REPLACE STRING IN 1ST
  2616. C INTERVAL BETWEEN DELIMITERS WITH SECOND.
  2617. C  HOWEVER:
  2618. C  &1 TO &4 GET CONTENTS (UP TO NULL) OF ARGSTR(X,1) TO (X,4)
  2619. C
  2620. C  &5 RETURNS XAC VALUE CONVERTED TO DECIMAL INTEGER AND
  2621. C  PRINTED.
  2622. C  &6 RETURNS XAC VALUE CONVERTED TO ASCII CODE (1 BYTE) AND
  2623. C  INSERTED.
  2624. C XAC ENTERS WITH CONTENTS OF ACCUMULATOR Z (TO AVOID TOO MUCH
  2625. C DIFFICULTY IN USING IT OWING TO THE UBIQUITY OF USE OF %).
  2626. C    WE ENTER JUST POINTING AT THE COMMAND LINE AFTER THE ENTER
  2627. C AND ITS SPACE. ASSUME 1ST CHARACTER IS OUR DELIMITER.
  2628.     DO 335 IV=1,80
  2629. 335    LWRK(IV)=0
  2630.     IDELIM=ICHAR(LCMD(1))
  2631.     ID2=INDX(LCMD(2),IDELIM)
  2632.     IF(ID2.GE.LENGTH)GOTO 100
  2633. C NOW HAVE 1ST STRING, OF NONZERO LENGTH
  2634. C FIND SECOND STRING NOW. EITHER MAY BE OF 0 LENGTH BUT
  2635. C BOTH MUST BE DEFINED BY A DELIMITER.
  2636.     ID3=INDX(LCMD(2+ID2),IDELIM)
  2637.     IF(ID3.GE.LENGTH)GOTO 100
  2638. C WELL, WE GOT IT SOMEHOW. NOW TRY AND EDIT THE JUNK IN.
  2639. C (NOTE WE WANT TO FILL ALL OF LENGTH)
  2640.     INLIN=1
  2641.     INWRK=1
  2642.     IVV=ID3+ID2+2
  2643.     DO 336 IV=IVV,LENGTH
  2644. 336    LCMD(IV)=0
  2645.     LSA=ID2-1
  2646.     LSB=ID3-1
  2647.     LSSB=2+ID2
  2648.     LZR=0
  2649.     DO 1 N=1,LENGTH
  2650.     IF(LSA.GT.0)GOTO 350
  2651. C ZERO LENGTH INITIAL STRING, SO ASSUME HE WANTS TO APPEND TO
  2652. C EXISTING STRING AT THE END.
  2653. C (HANDY FOR ADDING TO FORMULAE OR THE LIKE.)
  2654.     IF(LIN(N).EQ.0)GOTO 351
  2655. C JUST COPY THE INPUT FIRST AND GO OFF
  2656.     GOTO 2
  2657. 351    CONTINUE
  2658. C HERE WE HAVE THE TERMINAL NULL
  2659.     LZR=LZR+1
  2660. C ALLOW US TO PRETEND FOR ONCE THAT WE GOT A MATCH
  2661.     IF(LZR.EQ.1)GOTO 222
  2662.     GOTO 1
  2663. 350    CONTINUE
  2664.     IF(LIN(INLIN).EQ.0)GOTO 1
  2665.     CALL SSCMP(LIN(INLIN),LCMD(2),LSA,ICOD)
  2666.     IF(ICOD.EQ.0)GOTO 2
  2667. C HERE HAVE TO SUBSTITUTE
  2668. C PASS STRING TO SUBSTITUTE ON INPUT LINE FIRST.
  2669. 222    CONTINUE
  2670.     INLIN=INLIN+LSA
  2671. C ALLOW ZERO LENGTH SUBSTITUTE CHARACTER
  2672.     IF(LSB.LE.0)GOTO 1
  2673. C    DO 6 M=1,LSB
  2674.     M=1
  2675. 106    CONTINUE
  2676.     IF(LCMD(LSSB+M-1).EQ.'&')GOTO 7
  2677. 8    CONTINUE
  2678. C JUST COPY ONE CHARACTER OF THE SUBSTITUTE STRING IN HERE.
  2679.     LWRK(INWRK)=LCMD(LSSB+M-1)
  2680.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2681.     GOTO 6
  2682. 7    CONTINUE
  2683. C HANDLE & FORMS
  2684.     IF(LCMD(LSSB+M).LT.'1'.OR.LCMD(LSSB+M).GT.'6')GOTO 8
  2685. C REQUIRE ALL FORMS TO BE &1 THRU &6 TO BE DEALT WITH HERE.
  2686.     M=M+1
  2687.     IF(LCMD(LSSB+M-1).GT.'4')GOTO 10
  2688. C HERE JUST HANDLE ARGSTR SUBSTITUTIONS.
  2689.     II=ICHAR(LCMD(LSSB+M-1))
  2690.     II=II-48
  2691. C II IS NOW THE INDEX.
  2692.     DO 11 MM=1,52
  2693.     LWRK(INWRK)=ARGSTR(MM,II)
  2694.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2695.     IF(ARGSTR(MM,II).EQ.0)GOTO 12
  2696. 11    CONTINUE
  2697. 12    CONTINUE
  2698.     M=M+1
  2699. C PASS THE NUMBER OF THE &NUMBER FORM
  2700.     GOTO 6
  2701. 10    CONTINUE
  2702. C HANDLE ZAC FORMS
  2703.     M=M+1
  2704. C PASS THE DIGIT
  2705.     IF(LCMD(LSSB+M-2).EQ.'5')GOTO 14
  2706. C FILL IN ZAC AS AN INTEGER
  2707.     II=32
  2708.     IF(XAC.GE.1.AND.XAC.LT.256.)II=XAC
  2709. C ONLY HANDLE CONVERSION IF LEGAL
  2710.     LWRK(INWRK)=CHAR(II)
  2711.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2712.     GOTO 6
  2713. 14    CONTINUE
  2714. C HANDLE NUMERIC CONVERSION HERE
  2715.     LSU(1)=0
  2716.     III=0
  2717.     IF(DABS(XAC).LT.9999999.)III=IDINT(XAC)
  2718.     WRITE(LSU10(1:10),15,ERR=22)III
  2719. C    ENCODE(10,15,LSU,ERR=22)III
  2720. 15    FORMAT(I9)
  2721. 22    DO 16 MK=1,10
  2722.     IF(LSU(MK).EQ.0)GOTO 6
  2723.     IF(LSU(MK).EQ.' ')GOTO 16
  2724.     LWRK(INWRK)=LSU(MK)
  2725.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2726. 16    CONTINUE
  2727. 6    CONTINUE
  2728.     M=M+1
  2729.     IF(M.LE.LSB)GOTO 106
  2730.     GOTO 1
  2731. 2    CONTINUE
  2732. C HERE JUST ANOTHER CHARACTER TO MOVE, DO THE MOVE.
  2733.     LWRK(INWRK)=LIN(INLIN)
  2734.     IF(INLIN.LT.LENGTH)INLIN=INLIN+1
  2735.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2736. 1    CONTINUE
  2737. C COPY BACK OUT TO CMDLIN AFTER FIXUP
  2738.     IF(INWRK.GE.LENGTH)GOTO 3
  2739.     DO 4 N=INWRK,LENGTH
  2740. 4    LWRK(N)=0
  2741. 3    CONTINUE
  2742. C REPLACE COMMAND LINE WITH EDITED STRING FOR ENTRY NOW.
  2743.     DO 5 N=1,LENGTH
  2744. 5    LCMD(N)=LWRK(N)
  2745. 100    CONTINUE
  2746.     RETURN
  2747.     END
  2748. c -h- sign.for    Tue Sep  2 10:58:55 1986    
  2749.     REAL *8 FUNCTION SIGN(VAR)
  2750.     REAL*8 VAR
  2751. C ALWAYS RETURN 1. OR -1. FOR THIS PROGRAM ... NEVER 0.
  2752.     SIGN=1.
  2753.     IF(VAR.LT.0.)SIGN=-1.
  2754.     RETURN
  2755.     END
  2756. c -h- slend.for    Tue Sep  2 10:58:55 1986    
  2757.     SUBROUTINE SLEND(RETCD)
  2758. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  2759. C ALL RIGHTS RESERVED
  2760. C 60=MAX REAL ROWS
  2761. C 301=MAX REAL COLS
  2762. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2763. C VBLS AND TYPE DIMENSIONED 60,301
  2764. C **************************************************
  2765. C *                                                *
  2766. C *         SUBROUTINE   SLEND(RETCD)              *
  2767. C *                                                *
  2768. C **************************************************
  2769. C
  2770. C
  2771. C
  2772. C SETS VALUE OF LEND, POINTER TO LAST NON-BLANK CHARACTER
  2773. C IN LINE(80)
  2774. C
  2775. C
  2776. C
  2777. C
  2778. C RETCD VALUE       MEANING
  2779. C
  2780. C    1            NORMAL RETURN
  2781. C    2            ALL BLANKS
  2782. C
  2783. C
  2784. C
  2785. C   SLEND IS CALLED BY CALC
  2786. C
  2787. C VARIABLE    USE
  2788. C
  2789. C  BLANK      ' '
  2790. C    I        INDEXES CHARACTERS IN LINE(80).
  2791. C  LEND       UPON EXIT, POINTS TO THE LAST NON-
  2792. C             BLANK IN LINE(80).
  2793. C  LINE(80)   HOLDS COMMAND LINE.
  2794. C  RETCD      RETURN CODE.  1=NORMAL, 2=ALL BLANKS
  2795. C
  2796. C
  2797. C
  2798. C    SUBROUTINE SLEND(RETCD)
  2799.     InTeGer*4 LEVEL,NONBLK,LEND
  2800.     InTeGer*4 VIEWSW,BASED,RETCD
  2801. C
  2802.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2803.     CHARACTER*1 LINE(80)
  2804. C
  2805.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2806.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2807. C
  2808. C
  2809. C
  2810. C
  2811.     RETCD=1
  2812.     DO 100 I=1,80
  2813.     IF(LINE(81-I).NE.BLANK)GO TO 200
  2814. 100    CONTINUE
  2815.     RETCD=2
  2816.     RETURN
  2817. 200    LEND=81-I
  2818.     RETURN
  2819.     END
  2820. c -h- sscmp.for    Tue Sep  2 10:58:55 1986    
  2821.     SUBROUTINE SSCMP(LINA,LINB,LENM,ICODE)
  2822.     DIMENSION LINA(1),LINB(1)
  2823.     CHARACTER*1 LINA,LINB
  2824.     ICODE=1
  2825.     DO 1 N=1,LENM
  2826. c    IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  2827.     IF(ICHAR(LINA(N)).NE.ICHAR(LINB(N)))ICODE=0
  2828.     IF(ICODE.NE.1)GOTO 2
  2829. 1    CONTINUE
  2830. 2    CONTINUE
  2831.     RETURN
  2832.     END
  2833. c -h- sstr.for    Tue Sep  2 10:58:55 1986    
  2834.     SUBROUTINE SSTR(CMDLIN,LA,N,LE,FORM)
  2835.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  2836.     InTeGer*4 LA,N,LE
  2837.     InTeGer*4 VLEN(9),TYPE(1,1)
  2838.     CHARACTER*1 AVBLS(20,27)
  2839.     REAL*8 XVBLS(1,1),XX,VP,TMP
  2840.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  2841.     NI=N
  2842.     N=N+2
  2843. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  2844.     LAA=N
  2845.     LEE=LE
  2846.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  2847.     IF(IVLD.LE.0)GOTO 990
  2848. C    XX=XVBLS(I1,I2)
  2849.     CALL XVBLGT(I1,I2,XX)
  2850.     VP=128.D0**7
  2851.     DO 1 NN=1,8
  2852.     TMP=DINT(XX/VP)
  2853.     NBF(NN)=CHAR(IDINT(TMP))
  2854.     VP=VP/128.D0
  2855.     XX=XX-(128.D0*TMP)
  2856. 1    CONTINUE
  2857. C NOW NBF HAS 8 BYTES OF DATA CORRESPONDING TO DE-HASHED
  2858. C STRING. COPY TO FORM.
  2859.     NL=NI
  2860.     DO 2 NN=1,8
  2861.     FORM(NL)=NBF(NN)
  2862.     IF(NN.GE.1)NL=NL+1
  2863. 2    CONTINUE
  2864. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  2865. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  2866. C AND LSTC IS NEXT CHAR AFTER VARIABLE ON CMDLIN
  2867. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  2868. C AND MOVE CMDLIN DOWN.
  2869.     N=NL
  2870.     LE=LE-LSTC+NL
  2871.     DO 401 M=N,LE
  2872.     CMDLIN(M)=CMDLIN(M+LSTC-NL)
  2873. 401    CONTINUE
  2874. C HOPE ALL'S WELL NOW...
  2875.     RETURN
  2876. 990    FORM(N)=CMDLIN(N)
  2877.     RETURN
  2878.     END
  2879. c -h- strcmp.for    Tue Sep  2 10:58:55 1986    
  2880.     SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  2881. C COPYRIGHT (C) 1983 GLENN EVERHART
  2882. C ALL RIGHTS RESERVED
  2883. C 60=MAX REAL ROWS
  2884. C 301=MAX REAL COLS
  2885. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2886. C VBLS AND TYPE DIMENSIONED 60,301
  2887. C **************************************************
  2888. C *                                                *
  2889. C *   SUBROUTINE STRCMP(NAME,LENGTH,RETCD)         *
  2890. C *                                                *
  2891. C **************************************************
  2892. C
  2893. C
  2894. C  STRCMP LOOKS PAST BLANKS FOR THE NAME HELD BY NAME(1),...,NAME(LENGTH)
  2895. C  THE RETURN CODE RETCD INDICATES SUCCESS OR FAILURE:
  2896. C
  2897. C    1=MATCH
  2898. C    2=FAILURE
  2899. C
  2900. C  UPON EXIT, COMMON VARIABLE NONBLK
  2901. C         IF SUCCESSFUL, POINTS TO ONE BEYOND THE LAST CHARACTER SCANNED
  2902. C                 FOR MATCH
  2903. C         IF FAILURE, UNCHANGED
  2904. C
  2905. C
  2906. C
  2907. C  MODIFICATION CLASSES: M2
  2908. C
  2909. C
  2910. C
  2911. C  STRCMP CALLS GETNNB TO GET THE NEXT NON-BLANK FROM LINE(80)
  2912. C
  2913. C  STRCMP IS CALLED BY CMND
  2914. C
  2915. C
  2916. C
  2917. C
  2918. C VARIABLE       USE
  2919. C
  2920. C   I2        INDEXES NAME(LENGTH).
  2921. C   IS        HOLDS VALUE OF NONBLANK IN CASE AN ERROR OCCURS
  2922. C             AND IT IS NECESSARY TO RESTORE THE VALUE.
  2923. C   LENGTH    HOLDS THE LENGTH OF VECTOR NAME.
  2924. C   NONBLK    POINTER FOR COMMAND LINE HELD BY LINE(80).
  2925. C   RETCD     HOLDS RETURN CODE.  1=MATCH,  2=FAILURE
  2926. C
  2927. C
  2928. C
  2929. C
  2930. C    SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  2931.     InTeGer*4 LENGTH
  2932.     InTeGer*4 LEVEL,NONBLK,LEND
  2933.     InTeGer*4  RETCD,VIEWSW,BASED
  2934. C
  2935.     CHARACTER*1  LINE(80),NAME(LENGTH)
  2936.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2937. C
  2938.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2939.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2940. C
  2941. C UPON ENTRANCE, NONBLK POINTS TO THE FIRST CHARACTER
  2942. C IN NAME, COMPARE LOOKS PAST THIS TO THE NEXT CHARACTER
  2943. C SINCE CMND HAS ALREADY IDENTIFIED THAT FIRST CHARACTER
  2944. C IN THE COMMAND NAME (AFTER THE ASTERISK).
  2945.     IS=NONBLK
  2946.     CALL GETNNB(IPT,RETCD)
  2947.     GO TO (10,999),RETCD
  2948. C ON EXIT NONBLK POINTS TO LAST CHARACTER IN NAME
  2949. C
  2950. C
  2951. 10    DO 100 I2=1,LENGTH
  2952.     CALL GETNNB(IPT,RETCD)
  2953.     GO TO (20,999),RETCD
  2954.     STOP 20
  2955. 20    NONBLK=IPT
  2956.     IF(NAME(I2).NE.LINE(NONBLK))GOTO 999
  2957. 100    CONTINUE
  2958.     RETCD=1
  2959.     RETURN
  2960. C
  2961. C
  2962. C NO MATCH
  2963. 999    RETCD=2
  2964. C IF ERROR, RESTORE VALUE OF NONBLK
  2965.     NONBLK=IS
  2966.     RETURN
  2967.     END
  2968. c -h- svbl.for    Tue Sep  2 10:58:55 1986    
  2969.     SUBROUTINE SVBL(CMDLIN,LA,N,LE,FORM)
  2970.     InTeGer*4 VLEN(9),TYPE(1,1)
  2971.     CHARACTER*1 AVBLS(20,27)
  2972.     REAL*8 XVBLS(1,1)
  2973.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  2974.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  2975.     CHARACTER*3 NBF3
  2976.     EQUIVALENCE(NBF3(1:1),NBF(5))
  2977.     InTeGer*4 LA,N,LE
  2978.     NI=N
  2979.     N=N+2
  2980. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  2981.     LAA=N
  2982.     LEE=LE
  2983.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  2984.     IF(IVLD.LE.0)GOTO 990
  2985.     LAA=LSTC+1
  2986. C ACCEPT ANY DELIMITER
  2987.     LEE=LE
  2988.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,J1,J2,IVLD)
  2989.     IF(IVLD.LE.0)GOTO 990
  2990. C    XX=XVBLS(I1,I2)
  2991.     CALL XVBLGT(I1,I2,XX)
  2992. C XX IS COL #
  2993. C    XY=XVBLS(J1,J2)-1.0
  2994.     CALL XVBLGT(J1,J2,XY)
  2995.     IF(XX.LE..99.OR.XX.GT.DFLOAT(RRW))GOTO 990
  2996.     IF(XY.LE..99.OR.XY.GT.DFLOAT(RCL))GOTO 990
  2997.     IC=XX
  2998.     CALL IN2AS(IC,NBF)
  2999.     IR=XY
  3000.     WRITE(NBF3(1:3),300)IR
  3001. C    ENCODE(3,300,NBF(5))IR
  3002. 300    FORMAT(BZ,I3)
  3003.     NL=NI
  3004. C FILL IN DECODED VARIABLE NAME, ZOTTING OUT EXTRA SPACES.
  3005.     DO 400 NN=1,7
  3006.     FORM(NL)=NBF(NN)
  3007.     IF(FORM(NL).GT.64)NL=NL+1
  3008. 400    CONTINUE
  3009. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  3010. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  3011. C AND LSTC IS NEXT CHAR AFTER 2ND VARIABLE ON CMDLIN
  3012. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  3013. C AND MOVE CMDLIN DOWN.
  3014.     N=NL
  3015.     LE=LE-LSTC+NL
  3016.     DO 401 M=N,LE
  3017.     CMDLIN(M)=CMDLIN(M+LSTC-NL)
  3018. 401    CONTINUE
  3019. C HOPE ALL'S WELL NOW...
  3020.     RETURN
  3021. 990    CONTINUE
  3022.     FORM(N)=CMDLIN(N)
  3023.     RETURN
  3024.     END
  3025. c -h- swrt.for    Tue Sep  2 10:58:55 1986    
  3026. C
  3027. C SWRT - WRITE VARIABLE LENGTH STRING TO SCREEN WITHOUT
  3028. C RECORD TERMINATION.
  3029. C COPYRIGHT GLENN C EVERHART 1984
  3030. C ALL RIGHTS RESERVED
  3031. C *** Don't use for normal Amiga stuff, but have available in case
  3032. C *** it should be handy someplace...
  3033. C
  3034. C
  3035. ccc    SUBROUTINE SWRT(STRING,LENGTH)
  3036. ccc    CHARACTER*1 STRING(127)
  3037. ccc    INTEGER LENGTH
  3038. cccC DUMP OUT ALL WE CAN..
  3039. ccc    CHARACTER*9 SFM
  3040. ccc    CHARACTER*1 SFMX(9)
  3041. ccc    CHARACTER*3 SNM
  3042. ccc    EQUIVALENCE(SNM,SFMX(2))
  3043. ccc    EQUIVALENCE (SFMX(1),SFM)
  3044. cccC HERE ARE THE BUILT IN FORMATS. NOTE WE FILL IN THE
  3045. cccC REPEAT COUNT AT RUNTIME FOR THE TEXT TO BE WRITTEN.
  3046. cccC NOTE ALSO THAT THE 1ST CHAR IS A # SIGN TO SHOW UP PROBLEMS.
  3047. cccC FORMATS ARE (nnnA1,\)
  3048. cccC COMPRISING 13 CHARACTERS IN ALL.
  3049. ccc    DATA SFM/'(001A1,\)'/
  3050. cccC NOTE WE JUST FILL IN THE LENGTH AND WRITE TO SCREEN USING
  3051. cccC SFM AS A RUNTIME FORMAT.
  3052. cccC
  3053. ccc    IF(LENGTH.LE.0)RETURN
  3054. ccc    WRITE(SNM,1)LENGTH
  3055. ccc1    FORMAT(BZ,I3)
  3056. cccC WRITE ON UNIT 6 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  3057. cccC (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  3058. ccc    WRITE(11,SFM)(STRING(II),II=1,LENGTH)
  3059. ccc    RETURN
  3060. ccc    END
  3061.     SUBROUTINE VWRT(STRING,LENGTH)
  3062. C VWRT is like SWRT but writes to lun 11 window instead.
  3063.     CHARACTER*1 STRING(127)
  3064.     INTEGER LENGTH
  3065. C DUMP OUT ALL WE CAN..
  3066.     IF(LENGTH.LE.0)RETURN
  3067. C WRITE ON UNIT 11 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  3068. C (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  3069.     REWIND 11
  3070.     WRITE(11,777)(STRING(II),II=1,LENGTH)
  3071.     REWIND 11
  3072. 777    format(1X,127A1)
  3073.     RETURN
  3074.     END
  3075.